{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "035f6cca",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2023-05-07T03:48:18.992710Z",
     "start_time": "2023-05-07T03:48:17.156145Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "'cuda'"
      ]
     },
     "execution_count": 1,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "import torch\n",
    "from torch import nn\n",
    "import torch.nn.functional as F\n",
    "import transformers\n",
    "from transformers import AutoTokenizer, AutoConfig, AutoModel\n",
    "import numpy as np\n",
    "import pandas as pd\n",
    "import matplotlib.pyplot as plt\n",
    "import matplotlib as mpl\n",
    "from IPython.display import Image\n",
    "# default: 100\n",
    "mpl.rcParams['figure.dpi'] = 150\n",
    "device = 'cuda' if torch.cuda.is_available() else 'cpu'\n",
    "device"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "3dd72dbc-e167-4a46-b90e-a390348d803d",
   "metadata": {},
   "source": [
    "### SimCLR 与 InfoNCE"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "c18352d9-a54e-45c3-9d26-245595c5eb01",
   "metadata": {},
   "source": [
    "- Simple Framework for Contrastive Learning of Visual Representations\n",
    "    - https://arxiv.org/abs/2002.05709\n",
    "- Representation Learning with Contrastive Predictive Coding\n",
    "    - https://arxiv.org/pdf/1807.03748"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "23366a34",
   "metadata": {},
   "source": [
    "## softmax with temperature"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "583870af-451f-4652-97d4-a733d2a85de4",
   "metadata": {},
   "source": [
    "- T 越大，越平均；越小，越 sharp；"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "4dfcbe7c",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2023-05-07T03:48:27.173648Z",
     "start_time": "2023-05-07T03:48:27.169258Z"
    }
   },
   "outputs": [],
   "source": [
    "def softmax_with_t(x, T):\n",
    "    return np.exp(x/T)/sum(np.exp(x/T))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "5dffd664",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2023-05-07T03:48:33.943517Z",
     "start_time": "2023-05-07T03:48:33.631238Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<matplotlib.legend.Legend at 0x7f6c922921a0>"
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAwcAAAGbCAYAAACRY+xeAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuMCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy88F64QAAAACXBIWXMAABcSAAAXEgFnn9JSAACEgUlEQVR4nO3dd3xUVf7/8deU9IQECITeQhOEABIkCLp2VFRKcH+W74KsuKtiw94W0FVkQXQB2+oq7qqrEpqgqOtaAJGOIEEhhC4ECJCQQspk7u+PSWYyJCFlJjMp7+fjkUdy7j33zicZrt7P3M85x2QYhoGIiIiIiDR6Zn8HICIiIiIidYOSAxERERERAZQciIiIiIhIMSUHIiIiIiICKDkQEREREZFiSg5ERERERARQciAiIiIiIsWUHIiIiIiICKDkQEREREREiik5EBERERERQMmBiIiIiIgUU3IgIiIiIiKAkgMRERERESlm9XcA/tKqVStycnLo0KGDv0MREREREfGKAwcOEBYWRlpaWo2Ob7RPDnJycigsLPR3GCIiIiIiXlNYWEhOTk6Nj2+0Tw5KnhgkJyf7ORIREREREe/o3bu3R8c32icHIiIiIiLiTsmBiIiIiIgASg5ERERERKSYkgMREREREQGUHIiIiIiISDElByIiIiIiAnhpKtNNmzbx3//+l/Xr17Nu3ToOHz5MUFAQeXl5NTpfRkYGU6dOZfHixaSlpdGqVStGjhzJtGnTiIqK8kbINWYYBoZh+DUGaZhMJhMmk8nfYYiIiEgj5pXk4LnnnmPp0qXeOBUnTpwgISGBlJQUunTpwsiRI0lOTmbOnDl8/vnnrF27lubNm3vltarKbreTmZnJqVOnyM/P9+lrS+NitVqJiIggMjKSkJAQf4cjIiIi1XA8K5+PNxxg3d6TZOfbCA+yMrhLc24a2J4WEUH+Dq9KvJIcJCQkEBcXR3x8PPHx8bRq1arG53rwwQdJSUlh9OjRfPzxx1itjhDvu+8+5s6dy+TJk3nvvfe8EXaVGIZBWloamZmZPntNabxsNhunTp3i1KlTtG3bliZNmvg7JBEREalEXmER05Ylk7TpEIVF7hUmq1LSeeXrXSRe0J4p1/ciOMDipyirxmTUQo2MyWSqUVlRWloabdu2xWKxcPDgQWJiYpz78vPzad++PSdPnuS3335z21cTJavHVbZC8unTp/ntt98AaNmyJU2aNMFiqdtvqtRPdrudvLw8Tp06RXZ2NgCdOnXSEwQREZE6LK+wiHHvrGfd3pOV9r2wczPemzCoVhOEqt7jVsQrTw68ZcWKFdjtdi699NIyN/9BQUFcf/31vPPOO6xYsYLx48f7JKbTp08D0KxZM5+XM0njYjabCQ8PJywsjEOHDpGdnU1mZqaSAxERkTps2rLkKiUGAOv2nmTash1MH92nlqOquTo1W9HWrVsBGDBgQLn7S7aX9POF3NxcACIiInz2mtK4mUwmmjZtCkBWVpafoxEREZGKHMvKI2nToWodk7TpIMez6u4Y1jqVHBw4cACAdu3albu/ZHtJv9pmGAZFRUWA48mFiK8EBwcDjjEImh1LRESkbvpkw8EyYwwqU1hk8MnGg7UUkefqVFlRSZ11aGhoufvDwsLc+lVFSd3V2VJTU4mNjT3nsaVvyjTFpPiS2ezK2w3D0L8/ERGROqiq5URnW7vnBPdc2tXL0XhHnXpyUHIzXtGNkD5BFREREZG6Ijvf5tPjfKFOPTkoqevPyckpd39J/X94eHiVz1nRSO2KniiIiIiIiFRFeFDNbqVrepwv1KknBx06dADg0KHyB3aUbC/pJyIiIiLiLxd2blaj4wZ3qbszYNap5CAuLg6AzZs3l7u/ZHvfvn19FpO4M5lM1frq1KlTrcSxfPlyLrnkEiIjI2nSpAmXXHIJy5cvr/Z5Dh48yGuvvca4ceM477zzMJvNmEwm1q5dWwtRi4iISENyU3x7rObqjQsMsJi4aWD7WorIc3Xqmcbw4cMxm82sWrWKY8eO0bJlS+e+/Px8li1bhtls5pprrvFjlLWnPiy5PW7cuDLbVq9eTWpqKnFxcfTr189tX3R0tNdjmDNnDvfffz9Wq5UrrriCoKAgvvrqK66//nr+/ve/c99991X5XAsXLuTBBx/0eowiIiLS8LWMCKZ9s1D2ppdfEl+exAvqzn1defySHMybN4958+YxatQopk+f7tzeunVrbr75Zj744APuvvtuPvroI6xWR4iPPvoox48f57bbbqNVq1b+CLvW1Kclt+fPn19m2/jx40lNTWXkyJFMnTq1Vl9/165dPPTQQwQFBfHtt9+SkJDg3D5kyBAeeughrrnmGrp161al83Xp0oUHH3yQ+Ph44uPjueOOO/j+++9r81cQERGRBuJ/vxytVmJwYedmTLm+Vy1G5DmvJAefffYZzz33nNu2goICBg8e7Gw/88wzXHfddQCkp6ezc+dOjhw5UuZcr7zyCmvXrmXhwoX07NmTgQMHkpyczPbt24mNjeXll1/2Rsh1RlWW3C4sMvjP+gPsOZ5d60tu13V///vfsdls3HPPPc7EAKB79+489dRTTJ48mTlz5jB37twqne+GG27ghhtuqK1wRUREpIHKzC3kiUU/O9vNwgI5nVeIrZx1DwIspjrzQW9lvJIcHD9+nHXr1rltMwzDbdvx48erdK7o6Gg2bNjAlClTWLJkCYsXLyYmJoZJkyYxbdo0mjWr2cCPuqqhLbld20rGFSQmJpbZN3bsWCZPnsyyZcuqnByIiIiI1MS0ZckcK17pONBq5pM/DSYyJJBPNh5k7Z4TdbZEvDJeSQ7Gjx/P+PHjq9x/6tSp5yw/adq0KXPmzGHOnDmeB1eH1XTJ7clXdq83/8C8KSMjw7k6dv/+/cvsb9euHdHR0ezfv5/MzEwiIyN9HaKIiIg0Al8lp7Foy2/O9kNXdqdrS8eU/Pdc2rXOLnBWFXVqQHJ9YxgGp/NqvojFv9bsr9GS2//6cR93DOtS49dtEmz1y4q7nTp1Yv/+/dU6Zu/evc4Zj0oSg6ZNmzpXyz5bu3btSE9P58CBA/Tp03ifsIiIiEjtOJVTwJOLtzvb/TtEeXRfVtcoOfDA6TwbcdO+8vnrzv1mN3O/2V3j47dOuYrIkAAvRlQ1iYmJpKenV+uY0gveZWdnAxAaGlph/5KkoaSviIiIiDdN+TSZ9GxHOVGQ1cyssXFYSqYzzT4Gm9+DfT9AQTYEhkOnoTDgDxDe8hxnrTuUHIjPzJo1y6PjDcPxlOVcTz1K+oiIiIh42xfbj/Dp1sPO9iNX9yC2RTgUnoEVj8FPH4K90P2gPd/Cdy9C/1th+AwICPZx1NWj5EDqjYgIRy1fTk7FU4bl5uYC7k8cRERERDx1Ijufp0qVEw3s2JTbL+rsSAzeT4T9qys+2F4Im+ZD+m64LQkCQmo/4BpScuCBJsFWtk65qsbHv7VyD/O+rX550L2XdfV4zIE/PPzww9UuK5o1a5ZzIbUOHToAcOrUKXJycsodd3Do0CG3viIiIiLe8JdPkzmRUwBAcICZmSXlRMsfO3diUNr+1fDF43D932sxUs8oOfCAyWTyqHb/D0M68ubK1GoNSg6wmPhDQie/jBnwVFJSUrUHJE+dOtWZHERFRdGhQwcOHDjAli1bGDp0qFvfQ4cOkZ6eTocOHTRTkYiIiHjN8m2H+Wyba32ux4b3pHN0GGQddZQSVceWD+DSp+rsGASzvwNozFpGBJN4QbtqHVPXl9w+l3379mEYRrW+SmYqKlGykF5SUlKZ8y9YsACAESNG1PrvIiIiIo1DenY+f1ma7GwP6tyMcQmdHI0t/yo7xqAy9kLY/C/vBehlSg78bMr1vbmwc9UWdqsPS27Xtvvvvx+LxcIbb7zB2rVrndtTUlJ4/vnnsVgs3HfffW7H/Pbbb/Ts2ZOePXv6OlwRERGpxwzD4Jkl2zlZXE4UEmBhVmIc5pLZifb9ULMT76tiGZIfqKzIz4IDLLw3YRDTlu0gadPBckuM6tOS27WtR48ezJw5k8mTJzNs2DCuvPJKAgMD+eqrrzhz5gyzZ8+mR48ebscUFhayc+fOcs935MgRRo0a5Wzv2LEDgDvuuMM5qPm6667jmWeeqaXfSEREROqqZduOsGJ7mrP9xLU96dC81JTqBTWcOr2mx/mAkoM6IDjAwvTRfZh8Zfd6v+S2Lzz44IN07dqVmTNnsmrVKgAuuOACHnnkEW644YZqnSs/P59169aV2Z6c7Hp8qCcOIiIijc+xrDz+stQ1O1FCl+bcdmFH906BNZwdsabH+YDJaKQTw/fu3Rtwvwk8m91ud37i3KNHD8xmVWGJb+jfnoiIiP8YhsGd/97Ef3ccBSAs0MIXD1xM+2ZnLcS6ciZ889fqv8Blz8DFD3sh0rKqco97LrrjEBEREREpZelPh52JAcCT151XNjEA6P8HMFWz5Nsc4FgxuY5SciAiIiIiUuzo6TymfOr61H1o12huGVTB+km51Vu/CXCslFxHpzEFJQciIiIiIoCjnOjJRT+TecYxPWl4kJUXx/TBZDKV7ZyfDZ+MA6Oo6i/QcSgMn+GlaGuHkgMREREREWDh5t/436/HnO2nrzuPdk3LKScyDPjsITiR4trW9UpHyVB5zAFwwXi4bSEEBHs3aC/TbEUiIiIi0uilZeYxbZmrnOji7i34fXz78jv/9AFs+8jVHvogXDEVso85Fjjbt9oxXWlgOHQa6hhjUIdLiUpTciAiIiIijZphGDy+aBtZeTYAIoKszKionOjYL/BZqZmG2g+GS592/Bze0jELUS3NROQLKisSERERkUZtwcZDfLfzuLP9zPW9aB0ZUrZjQQ4sGA+2M452SFNI/CdYGs7n7UoORERERKTR+i3jDM8t3+FsX9qjBWMvaFd+588fheO/utqj3oTICvrWU0oORERERKRRMgyDxxduIyvfUU7UJNjK9NF9yy8n2voR/PS+qz3kXuh+tY8i9R0lByIiIiLSKH204SCrUlxrFUy9oTetIsuZTej4Llg+2dVuFw+XT/FBhL6n5EBEREREGp1Dp3L5a6lyoivOa8mo/m3Ldiw84xhnUJjjaAdHQeI7YKlg2tJ6TsmBiIiIiDQqdrvBo0nbyClwLGAWGRLAC6MqmJ1oxWNwzDXFKSNfg6gKVkxuAJQciIiIiEij8sH6A6xJPeFsP3tjb1o2Kaec6Ock2Pyeqz34buh5nQ8i9B8lB1ItJpOpWl+dOnXy6uunp6fz9ttvc+edd9KvXz+sVismk4mPPvqo8oNFRESk0Tt4Mpfpn//ibF/dO4Yb4tqU7Zi+G5bd72q3GQBXTPNBhP7VcCZlFZ8YN25cmW2rV68mNTWVuLg4+vXr57YvOjraq6+/evVqJk6c6NVzioiISONgtxs8krSV3OJyoqahAfx1ZDnlRIV5jnEGBdmOdlAkjH0XrIG+DdgPlBzUJdnHHI+u9v1QZ5fcnj9/fplt48ePJzU1lZEjRzJ16tRaff2YmBjuvvtu4uPjiY+PZ8aMGfz73/+u1dcUERGRhuHfa/ezds9JZ/vZG8+nRURQ2Y5fPglHf3a1b5wHTTvVfoB1gJKDuqDwjGOwy08fgr3Qfd+eb+G7F6H/rTB8BgSUUw/XiCQkJJCQkOBsm82qjBMREZHK7UvP4cUVrgXMru3TihF9W5ftuH0RbPynqz3oTuh1gw8irBuUHPhb4Rl4PxH2r664j70QNs131L7dlgQB5SznLSIiIiLlKpmd6Eyho5yoeVggz914ftlyopN74NP7XO3WcXDVX30Yqf/pY1d/W/HYuROD0vavhi8er914RERERBqY+Wv2sX6fq5zouZHn0zz8rHIiW37xOIMsRzswAhLfBWs5ZUcNmJIDf8o66iglqo4tHzjGJtRDnTp1qvZsR/v27fN32CIiIlKP7Tmezd++dJUTjejbmmv7lFNO9NUzcGSrq33DHGge64MI6xaVFXnCMCAvs+bHr/9H2TEGlbEXOo5LmFTz1w2OhPIW+ahliYmJpKenV96xlPDw8FqKRkRERBq6IrvBI0nbyCu0AxAdHsizN55ftuOOT2H9m672wAlw/mgfRVm3KDnwRF4mzOjo+9ddOdPxVVOP7YeQKK+FU1WzZs3y+WuKiIhI4/XO6r1s2n/K2f7ryD40CztrOtJT+2BpqQ9dY/rA1dN9E2AdpLIiEREREWlwdh/LZtZXO53tkf3aMPz8Vu6dbAWw4HbIL64ECQyHm95r1LND6smB+MzDDz9c7bKiWbNmeX0hNREREWnYiuwGDy/YSr7NUU7UIiKIqTf0Ltvx66lweLOrff3fG+U4g9KUHHgiONJRolNTa+bCqhqU2lz8iOdjDvwgKSmJ/fur9/eaOnWqkgMRERGplrdW7eGngxnO9guj+hAVelY50a+fw9pXXe0B46BPom8CrMOUHHjCZPKsdn/QnfDD36s3KNkc4DjOD2MGPKWZh0RERKS2pRzNYvZXu5zt0QPacmWvGPdOGQdgyV2udsvecM0MH0VYt2nMgT9FxEC/W6p3TP9bIbxl7cQjIiIiUo/Ziuw8tGArBUWOcqKYJkFMGXFWOVFRISRNgLwMRzsgDMbO1yKzxfTkwN+umQEnUqu2EFrHoTBcWe3gwYOdP6empgLwzDPP8MorrwAwYMAAXnvtNX+EJiIiIn705so9bDvkmmb+xdF9iQwNcO/0v2fh0AZXe8RsaNHdRxHWfUoO/C0gBG5Lcqx8vOWD8kuMzAGOJwbDZzTq0fMl1q1bV2bb7t272b17NwDBwfobiYiINDa/pp3mla9d5URjL2jHpT3PqrbY9SWsmeNq97sN4v6fjyKsH5Qc1AUBIY7R8Zc+BZv/BftWQ0G2YzqtTkNhwB/qdCnR/PnzmT9/vs9ezzAMn72WiIiI1H2FRXYeXrCVwiLHPULryGCeHtHLvVPmb7D4z652i55w7d98GGX9oOSgLglvCRc/7PgSERERkSp5/btUtv922tl+cUxfIkNKlRMV2WDhH+HMSUfbGuIYZxAY5ttA6wENSBYRERGRemvH4dPM/SbF2b55UHsu6d7CvdO3z8OBH13t62ZBy/N8FGH9ouRAREREROqlApt7OVHbqBCevPasm/7dX8Pq2a523/8H/W71YZT1i5IDEREREamXXv12NzuOuMqJZozpS0RwqXKi00dg0Z9c7ejucN1LjrWqpFxKDkRERESk3tn+Wyavfrvb2b71wg4M7Rbt6lBkg4V3QG66o20NdowzCAr3baD1jNeSg7y8PKZMmUL37t0JDg6mTZs2TJgwgUOHDlX7XF988QXXXHMN0dHRBAQE0LJlS0aMGMH//vc/b4UrIiIiIvVUSTmRze4oJ2rXNIQnzi4n+n6G+zpS18yAmLMWRJMyvJIc5OXlcfnll/Pss8+SnZ3NjTfeSPv27Xn33XcZMGCAc6Gqqpg9ezbXXHMNX375Jeeddx5jxoyhU6dOfPbZZ1xxxRW88cYb3ghZREREROqpud+k8GtalrP9t8S+hAeVmoQz9VtYOdPVPj8RBozzYYT1l1eSgxdeeIE1a9aQkJDArl27+Pjjj1m3bh0vvfQSx48fZ8KECVU6z/Hjx3niiScIDAxk5cqVrFq1io8++oj169eTlJSEyWTioYceIjs72xthi4iIiEg9s+1QBq995/rg+Q8JHRkSW6qcKOsoLLoTKF4XqVksXP+KxhlUkcfJQWFhIXPnzgXg1VdfJTzcVcc1efJk+vbty8qVK9m0aVOl51q3bh0FBQVcdtllDB061G3fmDFj6Nu3L7m5uezYscPTsEVERESknsm3FfHQJ1spKi4n6tAslMeG93R1sBfBojsg55ijbQkqHmcQ4ftg6ymPk4PVq1eTkZFBbGws/fv3L7M/MTERgGXLllV6rqCgoCq9ZrNmzaoXpIiIiIjUe698nULKMVcFyczEvoSVLidaOQv2rnS1h78Arfv6MML6z+PkYOvWrQAMGDCg3P0l20v6nUt8fDyRkZF88803rF692m3fokWL2LZtG0OGDKFr164eRi0iIiIi9clPBzN483tXOdHtF3Xiwi7NXR32roLvX3S1e42EgX/0XYANhLXyLud24MABANq1a1fu/pLtJf3OJSoqirfffptbb72Viy++mIsuuoi2bduyd+9eNmzYwPDhw5k/f76nIYuIiIhIPZJXWMRDn/xEcTURnZqH8ujVpcqJso87pi017I52005wwxyNM6gBj5ODksHBoaGh5e4PCwtz61eZxMREmjVrxu9//3u3pwcxMTFcdtllNG/e/BxHl9W7d/lTVqWmphIbG1utc4mIiIiI7738312kHs8BHPf7M8fGERJocey022HxnZCd5mhbAh3jDIIj/RNsPedxWZFhOFI4UwWZWcn+qnrppZe48sorufjii9m2bRvZ2dls27aNhIQEHnnkEX7/+997GrKIiIiI1BOb9p/kH6v2ONt/vKgz8Z1KjT9dPRtSv3G1r/ortCk7DlaqxuPkICLCMfo7Jyen3P25ubkAbrMYVeT777/n4Ycfpl+/fixYsIA+ffoQFhZGnz59SEpKon///ixcuJCvvvqqyvElJyeX+6WnBjVjMpmq9dWpUyevvn56ejpvv/02d955J/369cNqtWIymfjoo48qPfaXX35h7NixtGjRgpCQEPr06cPLL7+M3W73aowiIiLiHXmFRTyyYBslnzV3iQ7j4at7uDrsXwPfPu9qn3c9DLrTt0E2MB6XFXXo0AGgwpWQS7aX9DuXf/3rXwCMHj0as9k9b7FYLIwePZotW7bw3XffcdVVV3kSdp2UfiadRSmL2Ji2kRxbDmHWMOJbxTOq2yiiQ6IrP4EPjBtXdgGR1atXk5qaSlxcHP369XPbFx3t3bhXr17NxIkTq33c2rVrufzyy8nNzWXQoEF06tSJlStXMnnyZH744QcWLFhQ4dMvERER8Y9ZX+5kT7rjA2hzcTlRcEBxOVHOCUj6o2ucQVQHuGGexhl4yOPkIC4uDoDNmzeXu79ke9++lU8jVZJINGnSpNz9JdtPnjxZ7TjrsjxbHi+uf5GlqUux2W1u+3488iOvbX2NkV1H8vigxwmyVG2619pS3oDw8ePHk5qaysiRI5k6dWqtvn5MTAx333038fHxxMfHM2PGDP7973+f8xibzcZtt91Gbm4us2fP5sEHHwQc42CuuuoqFi5cyPz587n99ttrNXYRERGpug37TvLPH/Y62xOHdeGCjk0dDbsdFv8Jsg472uYASJwPIVE+j7Oh8bis6KKLLiIyMpLU1FS2bNlSZn9SUhIAI0aMqPRcrVq1AmDjxo3l7t+wYQOA10tV/CnPlsddX9/FwpSFZRKDEja7jaRdSfz5v38mz5bn4wjrloSEBF599VXGjx9P7969yzxhKs/ixYudTzZKEgNwlLq9+uqrAMyePbvWYhYREZHqyS2w8ciCrc5yotgWYTx4ZXdXhzVzYPd/Xe0rp0G7C3wbZAPlcXIQGBjIpEmTAJg0aZLb2IPZs2ezbds2hg4dSnx8vHP7vHnz6NmzJ0888YTbuUaOHAnABx98UGbRtKVLl/Lhhx9iNpsZNWqUp2HXGS+uf5GNR8tPhs628ehGZmyYUcsRNTzLly8HXAvylda/f3+6dOnC9u3b2bdvn48jExERkfL87Yud7DvhGLdqNsFLN/VzlRMdWAf/e9bVuce1MPhuP0TZMHmcHAA8/fTTXHjhhaxZs4Zu3brx+9//nsGDB/PQQw/RvHlz3n33Xbf+6enp7Ny5kyNHjrhtHzlyJGPHjqWoqIgbbriB+Ph4brrpJuLj4xk5ciR2u53nnnuOHj160BCkn0lnaerSah2zZPcS0s+k11JEDZM3F+oTERGR2rV2zwnmr9nnbP/pklj6tY9yNHJPQtIEMIoc7cj2cOOrGmfgRR6POQAIDg7m22+/Zfr06Xz44YcsWbKEpk2bMm7cOJ577jnat29fpfOYTCY+/vhjhg8fznvvvce2bdv46aefiIqK4tprr+Xee+9l+PDh3gjZKwzDIKswq8bH/+fX/1RYSlQRm93Gf379D+N6lx0YXFURARF+GXzbqVMn9u/fX61j9u7d63EZmTcX6hMREZHak5Nv49Gkbc5295hwHriim6NhGLDkbjhdPAmO2QqJ70Bos3LOJDXlleQAICQkhGeffZZnn3220r5Tp06tcOCqyWRiwoQJTJgwwVuh1Zqswiwu+s9FPn/df2z7B//Y9o8aH//DzT/QJLD8Qd+1KTExkfT06j31qMoUuJXx9kJ9IiIiUjtmfPErB046yoksZhOzxsYRZC0uJ/rxVdi1wtX58r9A+0F+iLJh81pyIFKZWbNm+fX1vbVQn4iIiHjfmt3p/OtHV4XB3b+LpW+7KEfj0Eb4eoqrc7erIOFe3wbYSHhlzIFIXVby9MEbC/WJiIiI92Xn23h0oaucqGerCO69rLic6MwpWHA7lJRiR7SBkW9AFWYslOrTkwMPRARE8MPNP9T4+PeS36tRedCdfe/0eMyBPzz88MPVLiuaNWuWxwupdejQgVOnTnHo0KFy19uozkJ9IiIi4n3TP/+FQ6fOAGAtLicKtJod4wyWToLM4nGBJotjnEFYcz9G27ApOfCAyWTyqHb/5p438872d6o1KNlqtnJzz5v9MmbAU0lJSdUekDx16lSPk4O4uDi2bt3K5s2bufbaa8vsr85CfSIiIuJdq1KO88E616Qg91zalfPbRjoa696EX5e7Ol/2FHRM8HGEjYuex/hRdEg0N8beWK1jRnYdSXSIZzfL/rJv3z4Mw6jWlzcWvLvuuusA14J8pW3ZsoU9e/bQq1cvOnfu7PFriYiISNVl5RXyWKnZiXq1bsI9l3Z1NH7bDF897eocezlc9CBSu5Qc+Nnjgx5nYMzAKvUdGDOQxwc9XssRNTyjRo2ic+fObN26lZdfftm5PScnh3vuuQeAyZMn+ys8ERGRRuv5z37hcGYeAAGWUuVEZzJgwXiwFzo6hreCUW9qnIEP6C/sZ8HWYF6/4nUSuydiNZdf5WU1W0nsnsgbV75BkCXIxxHWPYMHD3Z+ffbZZwA888wzzm133+2+SmJAQADvv/8+ISEhTJ48mcGDB/P73/+ebt268eOPPzJy5Ehuv/12f/wqIiIijdb3u47z0YaDzva9l3WjV5smjnEGn94LGcWlyCYzJP4Twlv4KdLGRWMO6oBgazBTEqZwT797WJyymA1pG8ix5RBmDSO+VTyjuo2qt6VEtWHdunVltu3evZvdu3cDjkX5zjZkyBA2bNjAlClT+O677/jpp5+IjY3loYce4oEHHsCsTyJERER8JvOMeznR+W2bcNfvYh2NDW/DL5+6Ov/uCeg01McRNl4mo5FO8t67d28AkpOTK+xjt9vZuXMnAD169NANpPiM/u2JiEhD9siCrSzY5JgtMMBiYvm9w+jRKgIO/wT/vBKKChwdO18C/7cYzBb/BVvPVOUe91x0xyEiIiIiPvPNr0ediQHAA1d0dyQGeacd4wxKEoOwljDmbSUGPqbkQERERER8IjO3kCcW/exsx7WL5E8Xd3GMM1h2P5zaW7zHBGPegvCW/gm0EVNyICIiIiI+MW15MkdP5wMQaDEza2wcVosZNr0LyYtcHS95FLr8zj9BNnJKDkRERESk1v13x1EWbf7N2Z58VXe6xURA2s+wotRU7Z2GwSWP+SFCASUHIiIiIlLLTuUU8ORiVzlR/w5RTBzWBfKziscZOJ4mEBoNo9/SOAM/UnIgIiIiIrVq6rJkjmc5EoAgq6OcyGIClk+GE7uLe5lg9D+gSWu/xSlKDkRERESkFn2xPY2lPx12th++qgexLcJhy7/h509cHYdNhq6X+yFCKU3JgYiIiIjUipM5BTy9xFVOdEHHpkwY2hmO7oDPH3V17DAEfvekHyKUsyk5EBEREZFa8Zel20nPdqxbEBxgZmZiXyy2XMc4A9sZR6eQZo71DCxW/wUqTnoXRERERMTrPv/5CMu3HXG2H726J11ahMPiuyB9p6vj6H9AZFs/RCjl0ZMDEREREfGq9Ox8nl6y3dke1KkZ44d0gp8+hK0fujpe9AB0u9Ln8UnFlByIiIiIiNcYhsEzS7ZzMsdRThQSYOFviX0xp++Ezx5ydWx/IVz2tJ+ilIooORARERERr1m+7Qgrtqc5249f05NOTUyOcQaFuY6NIU0h8R2wBPgnSKmQkgOpFpPJVK2vTp06efX109PTefvtt7nzzjvp168fVqsVk8nERx99VOmxv/zyC2PHjqVFixaEhITQp08fXn75Zex2e4XHZGRk8MADD9CxY0eCgoLo2LEj999/PxkZGV78rURERBqGY1l5PLPUVU40uEsz/m9wR1jxKBz/xdVx5BsQ2c4PEUplNCBZqmXcuHFltq1evZrU1FTi4uLo16+f277o6Givvv7q1auZOHFitY9bu3Ytl19+Obm5uQwaNIhOnTqxcuVKJk+ezA8//MCCBQswmUxux5w4cYKEhARSUlLo0qULI0eOJDk5mTlz5vD555+zdu1amjdv7q1fTUREpF4zDIOnF28nI7cQgNBACzMT4zBvX+BY06BEwiToMdxPUUpllBzUIbb0dDKSkshdvwF7Tg7msDBCBw0iKnEMVi/fZNfU/Pnzy2wbP348qampjBw5kqlTp9bq68fExHD33XcTHx9PfHw8M2bM4N///vc5j7HZbNx2223k5uYye/ZsHnzwQQCys7O56qqrWLhwIfPnz+f22293O+7BBx8kJSWF0aNH8/HHH2O1Oi6X++67j7lz5zJ58mTee++92vlFRURE6plPtx7mqx1Hne0nrj2P9vbfYNkDrk5tB8IVU30em1SdkoM6wJ6Xx9HnXyBj8WKw2dz25axZw/F584gaPZqYp57EHBTkpyjrhoSEBBISEpxts7nyyrjFixc7n2yUJAYA4eHhvPrqqwwYMIDZs2e7JQdpaWl88MEHBAQE8NprrzkTA4CZM2fy0Ucf8cEHH/C3v/2NmJgYL/12IiIi9dOx03n8ZWmys31R1+bc2r8FvHMlFOY4NgZHapxBPaAxB35mz8vj4MQ7yViwoExi4GSzkfHJJxy8YyL2vDzfBtgALF++HIDExMQy+/r370+XLl3Yvn07+/btc25fsWIFdrudiy++uMzNf1BQENdffz1FRUWsWLGiVmMXERGp6wzD4MnFP5N5xlFOFBZoYcaYvpi/ehKOusYfcONr0LSjn6KUqlJy4GdHn3+B3A0bqtQ3d8MGjr4wvZYjani2bt0KwIABA8rdX7K9pF9NjxEREWmMFm3+ja9/OeZsPz2iF+1+WwGb3nV1uvAuOG+EH6KT6lJy4Ee248cdpUTVkLFoEbb09FqKqHZ16tSp2rMdlf40v6YOHDgAQLt25c+KULK9pF9NjxEREWls0jLzmLbMVU40rFs0/y+2ED6939WpTX+48lk/RCc1oTEHHjAMA3tWVo2PP/nBhxWXElXEZuPkBx/S/PbxNX5dc0REmZl5fCExMZH0aiY24eHhHr9udnY2AKGhoeXuDwsLc+tX02NEREQaE8MweGLRNk7nOe5lIoKszLixO6YFN0BB8f1RUBNIfBesgX6MVKpDyYEH7FlZ7Bp0oc9f98Trr3Pi9ddrfHz39euwNGnixYiqZtasWT5/zdIqSogMw6hwW3WOERERaUwWbDrEtzuPO9vPjOhFm3XPQ9o2V6cb50Gzzn6ITmpKZUXS4JU8fcjJySl3f25urls/gIiIiGofIyIi0lgczjjDc8t2ONu/69GCsaGbYMNbrk7xE6HXjX6ITjyhJwfiMw8//HC1y4pmzZrl8UJqHTp04NSpUxw6dIi+ffuW2X/o0CFnv9LHlN5XlWNEREQaA8MweHzRz2TlF5cTBVuZeVkTTB+OcXVq1Reu+qufIhRPKDnwgDkigu7r19X4+BPvvMuJN96o9nHN77rL4zEH/pCUlMT+/furdczUqVM9Tg7i4uLYunUrmzdv5tprry2zf/PmzQBuiUNcXJzbvqocIyIi0hh8vOEgK3e5yommXduNFl9OgPzTjg2BETB2PgQE+ydA8YiSAw+YTCaPaveb3XoLJ95+u3qDkq1Wmt16i1/GDHjKGzMP1cR1113Hv/71L5KSknj66afd9m3ZsoU9e/bQq1cvOnd21UQOHz4cs9nMqlWrOHbsGC1btnTuy8/PZ9myZZjNZq655hqf/R4iIiL+duhULn/97Bdn+/KeLRl14k04vMXV6Ya/Q/NYP0Qn3qAxB35kbdGCqFGjqnVM1OjRWD38JL2xGTVqFJ07d2br1q28/PLLzu05OTncc889AEyePNntmNatW3PzzTdTUFDA3Xffja1UAvfoo49y/PhxbrnlFlq1auWbX0JERMTPDMPgsYXbyC4uJ4oMCeClvgcxrStVBXHB7XD+mArOIPWBnhz4WcxTT1Kwb1+VFkILjY8n5qknfRBV3TZ48GDnz6mpqQA888wzvPLKK4BjgbLXXnvN2ScgIID333+fK664gsmTJ/Pxxx/TsWNHVq1axZEjRxg5ciS33357mdd55ZVXWLt2LQsXLqRnz54MHDiQ5ORktm/fTmxsrFuiISIi0tB9sO4AP+w+4WzPvCKKqK/ucHWIOR+Ga7HW+k5PDvzMHBxM+7f+QdRNN4G1glzNaiXqppto//ZbmIOCfBtgHbRu3TrnV8kA5927dzu37dixo8wxQ4YMYcOGDYwZM4bdu3ezdOlSmjZtyqxZs0hKSsJsLnspREdHs2HDBu69914KCgpYvHgxmZmZTJo0ifXr13s8FkJERKS+OHgylxc+d5UTDT+vGVfueALyMh0bAsKKxxmE+CdA8RqT0UgnbO/duzcAycnJFfax2+3s3LkTgB49epR7A+lNtvR0MpIWkrt+PfacHMxhYYQOGkRU4hiVEjUyvv63JyIiUhG73eDWt9fx4x7HU4Oo0ADW9P+G0E2l1lwa/Rb0vclPEUppVbnHPReVFdUh1uhoov/8J/jzn/wdioiIiAgA76/b70wMAN4cdJzQtaUSg/7/p8SgAdHHkSIiIiJSrv0ncpj++a/O9i09zAza+pSrQ8tecM3f/BCZ1BYlByIiIiJSht1u8EjSNs4UFgHQMtTMtMKXMJ055egQEOoYZxAY6r8gxeuUHIiIiIhIGe/9uI/1e0862x92/R8Bh0vNrnjdS9Cihx8ik9qk5EBERERE3OxNz2HGF65yokdiD9B111uuDnG3QL9b/BCZ1DYlByIiIiLiVGQ3eGTBVvIK7QCcF5bFXSdnujpE94DrZvkpOqltSg5ERERExOndH/aycb9jXIGFIj5o+hbmM8WzFVlDiscZhPkvQKlVXksO8vLymDJlCt27dyc4OJg2bdowYcIEDh06VKPz7d69m4kTJ9KpUyeCg4Np0aIFQ4YMYebMmZUfLCIiIiLVlno8m5lf7nS2X2vzJc3SN7o6XPs3iOnlh8jEV7ySHOTl5XH55Zfz7LPPkp2dzY033kj79u159913GTBgAKmpqdU63+LFi+nTpw///Oc/ad68OaNGjaJ///7s3buXN9980xshi4iIiEgpRXaDhxdsJd/mKCe6LvRXrjr5gatDn5scaxpIg+aVRdBeeOEF1qxZQ0JCAl999RXh4eEAzJ49m4ceeogJEybw/fffV+lcW7du5f/9v/9HREQE//3vfxk6dKhzn91uZ/Pmzd4IWURERERKeXvVHrYcyACgBad4OWAepnzDsbN5VxgxG0wm/wUoPuHxk4PCwkLmzp0LwKuvvupMDAAmT55M3759WblyJZs2barS+e69914KCgqYP3++W2IAYDabGThwoKchi4iIiEgpu49l8dJ/dwFgxs6Hzd4mML94GlNLkGOcQVCE/wIUn/E4OVi9ejUZGRnExsbSv3//MvsTExMBWLZsWaXn+uWXX1i1ahXdu3dnxIgRnoYmIiIiIpWwFdl5aME2CorLiZ4I/ZRuuVtcHa55EVr18VN04mselxVt3boVgAEDBpS7v2R7Sb9z+d///gfAlVdeSV5eHh9//DEbN27EZDLRt29fbrrpJpo0aeJpyCIiIiJS7B+r9rD1YAYACeZk7rAvcO3sPRouuN0/gYlfePzk4MCBAwC0a9eu3P0l20v6nUtycjIAISEh9OvXj/HjxzNv3jzmzp3LxIkTiY2NZeXKlZ6GLB4wmUzV+urUqZNXXz89PZ23336bO++8k379+mG1WjGZTHz00UeVHvvLL78wduxYWrRoQUhICH369OHll1/GbrdXeExGRgYPPPAAHTt2JCgoiI4dO3L//feTkZFR4TF2u51XXnmFPn36EBISQosWLRg7diw7duyoya8sIiJSa3amZfHKf1MAiCaTN0Nfx0TxOINmXeD6v2ucQSPj8ZOD7OxsAEJDQ8vdHxYW5tbvXE6dcsyp+8orr9C0aVMWLVrEZZddxtGjR5k2bRoffvghI0eOJDk5mdatW1cpvt69e5e7PTU1ldjY2CqdQ1zGjRtXZtvq1atJTU0lLi6Ofv36ue2Ljo726uuvXr2aiRMnVvu4tWvXcvnll5Obm8ugQYPo1KkTK1euZPLkyfzwww8sWLAA01n/8Ttx4gQJCQmkpKTQpUsX57+9OXPm8Pnnn7N27VqaN2/udoxhGPz+978nKSmJqKgorrvuOtLT01m4cCGfffYZ3377LRdeeKFHfwMRERFvKCyy8/CCrRQU2TFj57WQ12liKxlnEOgYZxCsio3GxuPkwDAc2eXZN1Zn76+KoqIiAGw2G++//z5XXXUVAJGRkXzwwQekpKSwYcMGXn31Vf761796GHndk3u6gB2rD3M45RQFeUUEBlto070pvS5qQ2iTQH+HB8D8+fPLbBs/fjypqamMHDmSqVOn1urrx8TEcPfddxMfH098fDwzZszg3//+9zmPsdls3HbbbeTm5jJ79mwefPBBwJGwXnXVVSxcuJD58+dz++3uj00ffPBBUlJSGD16NB9//DFWq+Nyue+++5g7dy6TJ0/mvffeczvm3XffJSkpiW7durFq1SpiYmIAWLhwIYmJidx66638+uuvznOJiIj4yxvfpfLzb5kA3G1ZyiBjm2vn1S9A6zg/RSb+5PEdSkSEY+R6Tk5Ouftzc3MB3GYxquxcbdu2dSYGpd1+++1s2LCB7777rsrxlZQqna2iJwr+YCsoYtUnKfz64xHsRe7J1MFfTrFh+V56DmnNsJu6YQ2w+CnKuiEhIYGEhARn22yuvDJu8eLFzicbJYkBOP5NvvrqqwwYMIDZs2e7JQdpaWl88MEHBAQE8Nprr7ndzM+cOZOPPvqIDz74gL/97W/OBADgpZdeAiizfcyYMdxwww18+umnLF26lDFjxtTsDyAiIuIFvxw5zZxvHOVEF5p+YXLAQtfOXjdC/B1+ikz8zeMxBx06dACocCXkku0l/c6lpD69Y8eO59x/7NixakZZd9kKilg2dys7Vh8ukxiUsBcZ7Fh1mGVztmIrKPJxhPXf8uXLAdfMWaX179+fLl26sH37dvbt2+fcvmLFCux2OxdffLHbTT5AUFAQ119/PUVFRaxYscK5fe/evezYsYOQkBCuu+66Mq9VnZm7REREakthkZ2HPtlKYZFBM04zL+hVzBSPv4vqCDfM1TiDRszj5CAuzvHIqaLFyUq29+3bt9JzlUyFevLkyXL3nzhxAqjaU4j6YtUnKRxOyahS38MpGaxakFK7ATVANZlRy5Njzj//fAICAqp0jIiIiK+9+u1udhw5jQk7Lwe8RguK77vMAcXjDCL9Gp/4l8fJwUUXXURkZCSpqals2bKlzP6kpCSAKq1bcPnllxMWFkZqaioHDx4ss7+knKiiG7b6Jiczn19/PFKtY35dc4Tc0wW1FFHt6tSpU7VnOyr9aX5N1WRGLV8dIyIi4kvJhzOZ981uAP5sWc4lllLjDK56Dto2jHssqTmPxxwEBgYyadIknn/+eSZNmsRXX33lnKFo9uzZbNu2jaFDhxIfH+88Zt68ecybN49Ro0Yxffp05/bQ0FDuvfdeXnzxRe666y4+/vhj57m++OIL3nvvPUwmE3feeaenYXuFYRgUnLHV+PifvztUYSlRRexFBj9/d5B+V1ReplWRwBBrhQPIa1NiYiLp6enVOsYbT4lqMqOWr44RERHxlQKbo5zIZjcYaPqVhwI+ce3sOQIu/LP/gpM6wytTpjz99NN8/fXXrFmzhm7dujFs2DD279/PunXraN68Oe+++65b//T0dHbu3MmRI2U/NZ8yZQqrVq3is88+o1u3blx44YUcO3aMtWvXYrfbef755xk0aJA3wvZYwRkbb09e5fPX3fj5fjZ+vr/Gx98xexhBoWXLXmrbrFmzfP6apVVnRq2azMJV2TEiIiL+NO+bFH5Ny6Ipp5kbOA9ryTiDyA5w4zyNMxDAC2VFAMHBwXz77bc888wzhIaGsmTJEvbt28e4cePYsmULXbt2rda5vvnmG55//nmioqJYsWIFycnJXHrppSxfvpwnn3zSGyFLI1Ly9KE6M2rVZBauyo4p2d6QxsyIiEj98POhTF79LhUTdl4KeIPWppJxBlYY+y6ENPVvgFJneG2y9ZCQEJ599lmeffbZSvtOnTr1nPPhBwYG8uSTTyoRaGAefvjhapcVzZo1y+OF1Dp06MCpU6c4dOhQuQPjy5tRqyazcHlz5i4RERFvybcV8dCCnyiyG9xp+YzLLD+5dl4xFdoN9FdoUgdpJSYPBIZYuWP2sBofv+W/B9i0ovrlQQOv7ejxmAN/SEpKYv/+6v2+U6dO9Tg5iIuLY+vWrWzevJlrr722zP7yZtSqySxcJcds376dwsLCMjMWVWfmLhEREW/5+9cp7DqazQDTLh61fuza0X04JEzyX2BSJ3mlrKixMplMBIUG1Pirz+/aYbZUr77PbDHR53ftPXpdf9XE79u3D8MwqvVVsraFJ0rWHCiZOau0LVu2sGfPHnr16kXnzp2d24cPH47ZbGbVqlVl1tXIz89n2bJlmM1mrrnmGuf2zp07c95553HmzBk+++yzMq9VnZm7REREvGHrwQze+D6VSLKZEzgPq6l4nEGTdjDydY0zkDKUHPhRWGQQPRNaV+uYnkNaE9oksJYiaphGjRpF586d2bp1Ky+//LJze05ODvfccw8AkydPdjumdevW3HzzzRQUFHD33Xdjs7lmpXr00Uc5fvw4t9xyC61atXI7ruQ8jz76qFtSsWjRIj799FM6d+7MyJEjvf0rioiIlJFXWMRDC7ZiNwxmBbxJO1Nxaa/JAonvQGgz/wYodZLKivxs2E3dyDiaW6WF0Np0i2LYTd1qP6g6bvDgwc6fU1NTAXjmmWd45ZVXAMc6GK+99pqzT0BAAO+//z5XXHEFkydP5uOPP6Zjx46sWrWKI0eOMHLkSG6//fYyr/PKK6+wdu1aFi5cSM+ePRk4cCDJycls376d2NhYt0SjxIQJE/j8889ZvHgxPXv25PLLLyc9PZ3vv/+e4OBg3n///XIXSBMREfG2l7/exe5j2fzRsoIrLZtcOy5/Bjpc6L/ApE7TkwM/swZauP7eOHoNa1NhiZHZYqLXsDZcf18c1gCLjyOse9atW+f8KhngvHv3bue2HTt2lDlmyJAhbNiwgTFjxrB7926WLl1K06ZNmTVrFklJSZjNZS+F6OhoNmzYwL333ktBQQGLFy8mMzOTSZMmsX79+nLHQpjNZhYsWMBLL71EmzZtWL58OT///DOjRo1i48aNDBkyxPt/EBERkbNsPnCKt1buIc60m8es/3Ht6HolDLnff4FJnWcyypuwvRHo3bs3AMnJyRX2sdvt7Ny5E4AePXqUewPpTbmnC9jxw2EO7zpFQV4RgcEW2nRvSq+L2qiUqJHx9b89ERFpOPIKi7h2zirSjx/js8AnaW8+7tgR0Qb+vArCPJvoQ+q2qtzjnovKiuqQ0CaBDLymE1zTyd+hiIiISD310lc72XM8mzcC/uFKDEwWSPynEgOplD6OFBEREWkgNu47ydur9zLO8hXDLRtcOy59EjqqtFUqp+RAREREpAE4U1DEwwu20ps9PGn9wLUj9jIYOrniA0VKUVmRiIiISAMw88udnDiRznuBcwgyFU/BHd4KRv0DNHZNqkjJgYiIiEg9t27PCd5ds4e5AW/R0Vy8zo7JDGPehvAW/g1O6hWlkSIiIiL1WG6BjUeStnGr+WtGWNa5dlzyOHQe5r/ApF5SciAiIiJSj81Y8Svhp3bwjPV918bOF8PFD/svKKm3VFYkIiIiUk+tSU0n6cdfWRY4hyBToWNjWEsY/TaYtXCqVJ+eHJyDyeRasdhut/sxEmlsioqKnD+X/ncoIiJSIiffxqMLtvJCwD/pYk4DwMAEY96CiBg/Ryf1lZKDczCZTAQGOlYmzsnJ8XM00picPn0agKCgICUHIiJSrukrfmFo1ufcaFnj3Ga6+BHo8jv/BSX1nsqKKhEREcGJEyc4evQoAGFhYZg1HZjUAsMwyM/PJysri5MnTwLQtGlTP0clIiJ10eqUdDauW82SwPdcGzsOhd897r+gpEFQclCJ5s2bk5OTQ15eHocPH/Z3ONKIREVFERkZ6e8wRESkjsnKK2Rq0jreDPg7wcXjDIzQaExjNM5APKfkoBIWi4UOHTpw4sQJsrKyKCgo8HdI0oBZLBbCwsKIiIggIiJCJUUiIlLGC5/9wl25rxFrOeLcZhr9JjRp7ceopKFQclAFFouFli1b0rJlSwzDwDAMf4ckDZDJZFIyICIi57Ry13Fsm//NmIDVro1DJ0PXK/wXlDQoSg6qSTdwIiIi4g+n8wp5Y8Fy/mmd79xmbz8Y86VP+S8oaXA0slZERESkHpjx6Sam5s8kxOQocbYFN8Wc+A5Y9FmveI+SAxEREZE67ttfjxG37QW6m39zbrOO/gdEtvVjVNIQKTkQERERqcMycwv5fsEcbrJ+79xmT7gXul/lx6ikoVJyICIiIlKHvbFwBY/Y/uFsn4m5APMVU/wYkTRkSg5ERERE6qhvtu3nhpQnCTPlA5BnbULIze+BJcDPkUlDpeRAREREpA7KyC0gc/FkzjMfdG4LGP06RLX3Y1TS0Ck5EBEREamDPn1/DqOMr53tjLiJWHqN8GNE0hgoORARERGpY1at/ZHRv810to81OZ+o61/wY0TSWCg5EBEREalDTmaepuUXfybclAdAjimM5uPeB2ugnyOTxkDJgYiIiEgdkvzuJHqwz9nOGv53LM07+y8gaVSUHIiIiIjUEVtWvMOwjKXOdnK7/0erC8f6MSJpbJQciIiIiNQBpw79Srd1TzrbqdZu9PzD3/0YkTRGSg5ERERE/M2WT9a/byOcMwBkGSEE3fwelsBgPwcmjY2SAxERERE/2/ufyXTIT3G2N8ZNo11sbz9GJI2VkgMRERERP8rcvJDOqe8721+FjuCSkXf6MSJpzJQciIiIiPiJcXIvAcvvdbZ/MTrRc9xczGaTH6OSxkzJgYiIiIg/2ArI+Nf/EWrPASDbCGbnsDl0iGnm58CkMVNyICIiIuIHuZ8/TdOMn53td5s9wA2XXezHiESUHIiIiIj4nPHrZ4RuftPZXmBczsj/u1/lROJ3Sg5EREREfCnjAIUL/+xs/mJvT9HV02nfLNSPQYk4KDkQERER8ZWiQgo+Hk9g4WkAcowg3mk9hd8ndPdzYCIOSg5EREREfMT437MEHtnkbP+ViTxw8whMJpUTSd2g5EBERETEF3Z9iWnNHGfzE9sl9BvxJ9pGhfgxKBF3Sg5EREREalvmb9gXucYZ7LK35b+dHuKmge39GJRIWVZ/ByAiIiLSoBXZMBb+EXPeSQDOGIE8ap7M62MHqZxI6hyvPTnIy8tjypQpdO/eneDgYNq0acOECRM4dOiQR+dNSUkhJCQEk8nE8OHDvRStiIiIiI98+zymAz86m3+xjefWEVfTOlLlRFL3eCU5yMvL4/LLL+fZZ58lOzubG2+8kfbt2/Puu+8yYMAAUlNTa3zuP/3pT+Tn53sjTBERERHf2v01rJ7tbC4sGsqJrmNJvKCdH4MSqZhXkoMXXniBNWvWkJCQwK5du/j4449Zt24dL730EsePH2fChAk1Ou8///lPvv32WyZOnOiNMEVERER85/QRjEV/cjZ329vwN8udTB/TV+VEUmd5nBwUFhYyd+5cAF599VXCw8Od+yZPnkzfvn1ZuXIlmzZtqugU5Tp27BiPPPIIV1xxBTfffLOnYYqIiIj4TpENFt6BKTcdgDwjgHsK7+OxGy4gpkmwn4MTqZjHycHq1avJyMggNjaW/v37l9mfmJgIwLJly6p13vvuu48zZ87w+uuvexqiiIiIiG99PwP2r3Y2p9rG0b5nPKP6t/VjUCKV8zg52Lp1KwADBgwod3/J9pJ+VfH555/z8ccf8+STT9K1a1dPQxQRERHxndRvMVbOdDaXFg3hi8CreGH0+SonkjrP46lMDxw4AEC7duUPrCnZXtKvMjk5Odx999306NGDxx57zNPwRERERHwnKw0WTcSEAcAeeyueLPwjL4w5n5YRKieSus/j5CA7OxuA0NDQcveHhYW59avM008/zf79+/nmm28IDAz0NDx69+5d7vbU1FRiY2M9Pr+IiIgIAPYiWHgH5BwHIN8IYFLhfQzt3Ykb4tr4OTiRqvE4OTAMR2Zc0WOykv1VsXHjRubOncsf/vAHLr30Uk9DExEREfGdlTNh3ypn81nb/3EkpBvvjeyjciKpNzxODiIiIgBHOVB5cnNzAdxmMSqPzWZj4sSJREZGMmvWLE/DckpOTi53e0VPFERERESqbe9K+O5FZ3N50WA+KLqceSPPp0VEkB8DE6kej5ODDh06AFS4EnLJ9pJ+FTl06BA//fQTrVq1YuzYsW77MjIyAFi/fj2/+93vCA8PZ/ny5R5GLiIiIuIF2ccc5UTF4wz22WN4vPAOruvThhF9VU4k9YvHyUFcXBwAmzdvLnd/yfa+fftW6XxpaWmkpaWVu+/UqVN8//33REZG1iBSERERES+z22HRnZB9FIB8w8o9hfcRFBbFszeqSkHqH4+Tg4suuojIyEhSU1PZsmVLmbUOkpKSABgxYsQ5z9OpU6cKxyd89913XHrppVx99dV88cUXnoYsIiIi4h2rX4I93zqbz9tuJdnozOsjz6d5uMqJGpv0M+ksSlnExrSN5NhyCLOGEd8qnlHdRhEdEu3v8KrE43UOAgMDmTRpEgCTJk1yG3swe/Zstm3bxtChQ4mPj3dunzdvHj179uSJJ57w9OVFRERE/GPfD/DtC87miqJ4/lV0FdfHteGaPq39GJj4Wp4tj6lrpnJl0pXM3TKXH4/8yLbj2/jxyI/M2TKHK5OuZNqP08gvyvd3qJXy+MkBOKYf/frrr1mzZg3dunVj2LBh7N+/n3Xr1tG8eXPeffddt/7p6ens3LmTI0eOeOPlRURERHwrJx0W/hEMOwAH7C14rPBOosODefYGlRM1Jnm2PO76+i42Ht1YYR+b3UbSriT2Ze7j9SteJ9had9e88PjJAUBwcDDffvstzzzzDKGhoSxZsoR9+/Yxbtw4tmzZolWORUREpOGw22HxnyDL8SFngWFhUuF9nCaMF0adT9Mwz9dpkvrjxfUvnjMxKG3j0Y3M2DCjliPyjMmozkIEDUjJVKYVTXUqIiIiUq7VL8PXU53NZwv/j3eKrmFkvza88v/6V3ycNDjpZ9K5MulKbHZblY+xmq38N/G/tTYGwdN7XK88ORARERFpFA6shf8952x+VXQB7xQNp0VEEFNVTtToLEpZVK3EABwlRotTFtdSRJ5TciAiIiJSFbknIWkCGEUAHDKieaTwT4CJ6aP6EBWqcqLG4IztDCmnUvjfgf/x6e5Pa3SODWkbvByV93hlQLKIiIhIg2YYsOQuOP0bAIWGhXsL7iWTcMYMaMcVvWL8HKB4U3ZBNgezDnIg64Dj++kDjp9PH+TYmWMenz/HllN5Jz9RciAiIiJSmR/nwS7XWkt/s/2eLUY3YpoE8Zfre/kxMKmpzPxM503/gawDHMo65GyfzDtZq68dZg2r1fN7QsmBiIiIyLkc3OA2APl/Rf15u+haAF4c05fIkAA/BSbnYhgGJ/NOOp8AlP70/0DWAU4XnK7xuQPMAbSLaIdhGOw7va/ax8e3iq+8k58oORARERGpyJlTjnEGxYNOjxjNeKjwzxiYuWlgOy7t0dLPATZudsPO8dzjZct/in/OteXW+NzBlmDaRbSjQ0QHOjTpQPuI9nRo0oEOER2ICY3BYrbUeLaiUd1G1Tiu2qbkQERERKQ8hgFL7oHMAwAUYWZSwb1kEEHryGCeHqFyIl8osheRlpvGgdOOm/7SScChrEPkFeXV+NxhAWF0iHC/8S/5uUVIC0wm0zmPjw6J5sbYG1mYsrDKrzmy68ham8bUG5QciIiIiJRn3Ruw8zNnc1bhTWwyegAwY0xfmgSrnMhbCu2FHMk+4iz/KV0KdCj7ULWnCy0tMijSedN/dhLQLLhZpQlAZR4f9Dj7T++v0kJoA2MG8vigxz16vdqm5EBERETkbL9tgq+ecTa/t8fxRtEIAG4e1J6Lu7fwV2T1Vn5RPr9l/eZe/1/8FOBIzhGKiqeIrYlmwc3cy39K/RwZFOnF36KsYGswr1/xOjM2zGDJ7iXlJjJWs5WRXUfy+KDHCbIE1Wo8nlJyICIiIlLamQxYcDvYCwFINzXjwYK7MDDTNiqEJ689z7/x1WG5hbmu0p/im/+SAcBpOWkYGDU+d8vQlmUSgJKnAeGB4V78Laov2BrMlIQp3NPvHhanLGZD2gZybDmEWcOIbxXPqG6j6nQpUWlKDkRERERKGAZ8ei9k7AfAjpm78+7hJE0ARzlRRCMvJ8oqyHLd/J8+6FYKdPzM8Rqf14SJNuFtXIOAIzrQvokjCWgX0Y4Qa4gXf4vaER0SzcS+E5nYd6K/Q6kxJQciIiIiJTa8Db+4Vr19xTaG9YbjScFtgzswtFv9+PTXE4ZhONYAyHKf+rPk51P5p2p8bovJQtvwts6b/tJPAtqGtyXQolWm/U3JgYiIiAjA4Z/gyyedzc3WfszLuxGAdk1DeOKahlNOZBgGJ/JOuBYBO128CFhxEpBVkFXjcweYA1xlP6WSgPYR7WkV3ooAc+N+8lLXKTkQERERyTsNC8ZDUQEA2QHNuTPrT9gxA/C3xL6EBdWv2ya7YedY7rFy5/8/kHWAM7YzNT53iDXEve6/VBLQMrQlFrPFi7+J+FL9+lcuIiIi4m2GAcvuh1N7HU1M/Dn3z6TjmOVmXEJHhsTWzXIim91GWk5aueU/h7IPkV+UX+NzhweElzv/f4eIDkSHRHs8BajUTUoOREREpHHb9C4kL3I2/x34e1bn9QagQ7NQHrump78iA6CwqJDfsn9zzf5T/On/wayDHq8BEBUU5Vb+U5IAtI9oT9OgpkoAGiElByIiItJ4pf0MK1yLUu1vcgFTjznWMzCZYNbYOEIDa/92Kc+W50gAyin/OZJzBLthr/G5o0OiXQuAFQ8ALpkBqLbXAJD6R8mBiIiINE75WcXjDBylN4XB0dx0fIJznMH4IZ0Y1LmZ116uZA2A8lYBPpp71KNzx4TGlFv+0y6iHWEBYV76DaQxUHIgIiIijY9hwPLJcGK3o4mJp0z3ctRoCkCn5qE8enX1y4lOF5wuM/d/SRKQfia9xuGaTWZah7V2m/qz5ElAu4h2BFuDa3xukdKUHIiIiEjjs+Xf8PMnzuaaNuP4ZE83wFVOFBJYdsYdwzDIyM8o8+l/SUKQkZ9R45CsJivtItq5FgErtRJw2/C2BFg0BajUPiUHIiIi0rgc3QGfP+psZsXEM27v5c72Hy/qRMeWRWw6uqlM+c/BrINkF2bX+KUDzYFlpv4s+blVWCusZt2aiX/pX6CIiIg0HgU5sGA8dtsZjlos7A9vxjO2eCwtvsQacILg0FMszTjJxwvyavwSIdaQMp/8l/zcMrQlZpPZi7+QiHcpORAREZEGyWa3cSTniPv8/7s+40DQaQ51bE+BuWSazuUEFv9UBBQVVX7uiICIMtN/liQBzYObawpQqbeUHIiIiEi9VVBUwG/Zv7lN/VkyBuBw9mFsRjlrAARWrXa/aVDTcst/OkR0IDIoUgmANEhKDkRERKROO2M7w6GsQ86bfucg4KyDHq8BYC+MwF7YnHBzKyZcOJDOkR1p38QxE1CTwCZe/C1E6gclByIiIo1Y+pl0FqUsYmPaRnJsOYRZw4hvFc+obqOIDon2WRw5hTlun/6X/vlY7rEan9eEiZjQlnQ4fZz2uafpYCukgymY79pM4f0tYWAEYTGbePuuIcS1j/LeLyRSTyk5EBERaYTybHm8uP5FlqYuxWZ3L7358ciPvLb1NUZ2Hcnjgx4nyBLkldfMzM+sMAE4mXeyxuc1m8y0CWtTZgBwh4gOtI1oS9Dyh+DgBmf/Xy+bzfufuxYG+9PFXZQYiBRTciAiItLI5NnyuOvru9h4dGOFfWx2G0m7ktiXuY/Xr3i9SotsGYbBybyTZab+LGln5mfWOGar2Uq78HZlVgFuH9GeNmFtKl4DYNsnjjUNihUOuoeJa6OBMwB0jwnn/iu61TgukYZGyYGIiEgj8+L6F8+ZGJS28ehGZmyYwZSEKYAjATh+5ni58/8fyDpATmFOjeMKsgS5rfzrfBLQpAOtQlthMZddlOyc0lNg2QOudtuB/DX/Jg6e/A0Ai9nES2P7EWSt5nlFKmBLTycjKYnc9Ruw5+RgDgsjdNAgohLHYI32XZmeJ5QciIiINCLpZ9JZmrq0Wscs2rWItOw00nLTOJR1iLyimq8BEGoNLXf+/w4RHWgR2sJ7awAUnoEF46EkWQmOZGP8S7z30W/OLvf8LpY+7SK983rSqNnz8jj6/AtkLF4MNvcyvZw1azg+bx5Ro0cT89STmIO8U6ZXW5QciIiINAI2u43M/Eze/vlttzEGkTkGl/1k0OuAQUiBwZlAEzs6mvgmzkRmmGOqTjt2Vh9eXeXXigiMoGNExzLrALSPaO+7NQC+eAKObnc2z1w3l/s/c41r6NkqgkmXqZxIPGfPy+PgxDvJ3bCh4k42GxmffELB3r20f+sfmIMrL9PzFyUHPpR7uoAdqw9zOOUUBXlFBAZbaNO9Kb0uakNok8DKTyAiTrqepLGyG3ayCrLIzM8kIz/D+f10wWky8jPIyMsgsyCTzPxMtz7Zhdlu5wkoNLj9aztDfgnnWMwQTkV147QlCEtRPgl7U7hx7Rp+OC+b+VeaKbSWvZlvFtzM+Yl/6fn/OzRxrAHgV9sXwqZ3Xe0L7+K53V34LeMAAFaziVlj4wi0aqVi8dzR519wJgYFAREcbu24noqKr6emGSm0ObKGwMIscjds4OgL02n97DQ/R10xk2EYhr+D8IfevXsDkJycXOuvZSsoYtUnKfz64xHsRWX/3GaLiZ5DWjPspm5YA1T3KHIuzutpzRHs9nKuJ7OJnhfpepK6zzAMcm25zhv4jPwMTuefdrvhz8zPJLMg023f6YLTHs3rD47E4IkFZqxBiRxpNRjDXPazQpPdRuu0tdjyFzB9rEHzqNY8PPBh55OA8MBwj2KoNSdS4c1LoCDL0W7Tn1XDPuD/3vvJ2eWBK7rxwBXd/ROfNCi248dJufQyiuwmUrpWfj11270Aixm6ffdtrY1B8PQeV08OapmtoIhlc7dyOCWjwj72IoMdqw6TkZbL9ffGYQ3UDY1IeWwFRSz7+xYOp56usI/dXnw9Hcnm+vv663oSn8gvyicjL8PtE3y3G/zyfi7ILDOFqC+YMHH712YKmt7FsaiKb5ANs5XDbYYSldGS8V+/zvYJnbm609U+jLQGCvMc4wxKEoOgJmTd8BaPvfurs0uv1k2459Ku/omvjjAMA4qKMOx2x/ciOxh2921nfy+yg72870Vgtxd/NyroU4Vji2Oo0rFu8TmOLfle4TnO9bud9d15jir0tefnU2Q3sbXv3WRU4XrKDW1J3LbXyEhaSPSf/+TDd73qlBzUslWfpJwzMSjtcEoGqxakcOmtPWs3KJF6auV/fnUkBoYB56pZNgwO7z7Nqv/8yqXjevsuQKn3Cu2FnM4/XXHJTqkb/NJ9PBmgW1Nmk5kmgU2IDIokMiiSqKAoIgMj3dpRQVE0CWri2Fe87eM1bxJ5Jpu01t2rdC1lRHWn7ZExNAn27WrB5d7Ann1DeXafb6bDzh0YhhUMMK54nDc++pkme4/Q1DAIMBlMH9ab/LU/km+3F5+nejewNbsZLf/YMueoxg2s2znsRjVvfhtl0UitSel+syMxqOL1lNI1kSbr14OSg8YnJzOfX388Uq1jfl1zhAuv76KaaZGzuK4n87n/4wvO/b/8eIQLR3XT9dSIGIYBhoG9yEZW/mkyzpzidF4GGXmnOJ2XSVZeJpl5GWTln+Z0XibZ+ac5nZ9Jdt5psvKzOFOYg8kAswGmki8os63k53ADmpy1HcBsGGX6lvezoy+EmIMJs4YSZgkhzBJKqDWEUHOw83uIJZhQSwghlmBCzMEEW4IIMgVgygVy7I6bPrvhuMm0O25QMdLBOOa2L9tuZ9Dm7ayMudXx4lW8lo7GDGbYjDc4+J9d1bwZPcdNcSXnqPkNbEvXj1/OYwQwovTulXCwhmcWOVt+YBOOtBrsaFTxejrSajBnTu+t5chqTslBLfrlh/LHGJyLvchg+bytRLfzvJbTp58L+OpTCB/+Uj57KZ/+TvX3D5i+PxOD6g0eNDCzdOY6mrUJL/43ahTH5biBNJw/n/29OPiSPqXaJWfGcD/OcOvj2ufaXv5xJf3LjaX4WMMoP7azvxtnHef2WqViK/M7VXBuo7zXOus4gwr2nR33Wa91rt+37N/krLiN4lct7m8q/d+fSv7dWYHmQHPCgXCg7bkPOBcfTLhTBGQVfzkYOBbvOlPjc+aEXlFuTfS5GGYrm5qOIuxoWtUOMOGFOwwf/IGrwaf/T62ML2Z7Ku81i79MlPzsvp3i7abS2ym134Rjpirnds59Tkyu/mXOefa5Kjn2nHGU2l7BuZxxlmwv3pa+83CNrqdD4X3o4YW3pTYoOahFh1NO1ei44weyOH4gq/KOIlKpk8cLOXm8Ztei54r/B9KQmM76Lo1GTnhbcsI9SKZEqqL485W6oQrBWJvV6MynmtbdaXQ1h1ctKsgr8ncIIiIiIlLHGFEt/B1ChfTkoBYFmGs21VxEpJVuA5o7Hp0X14liGI4BUcXfHfvs7j8bRqma0+J+FH8v71jnOV31qNjP3mecVcdaqp/hfg5TyTZ7yX7X67m9/lmxlLvvnGVKvvtIwdQQa4vqzkcy1XKk1WDyQqr/H9OQ3GO0TltbcQe3R+KUenRsct9Xqk9Fj6rP/QjbfO5jzorF7bF8eY/cy3t8X7LdXLVjDKAIOzajqPjLhs0ootBuw2bYKDRs2OyO74WGjUK7jUKjEJtR5PhXZCr+XK04fLefz95nAkyG63M4E9jLO0dxXCXbS58rwBJAoDWIQEug47s1iCBLEEHWIIKswQRaHN+DrMEEW4Md+61BmMzmUr+/629R0Xvsj4oNX9r++a9kF1R/HE54YAF9rjuvFiLywLFfYOt/XO128eR1vZa3Vu0hJ9/xAV3rqGD+b3BHzN54Y+vQvw1TXQoG6tbfxoexJK/8jYxj1S/zCwqvu6skKzmoRU1z9nGI6s9h22LLIqKWflkLEUmjYLU6boasVkwWi9vPWC2YzJbin8/qZ7FAyffiflgtmCxWt30mqwXMxd8tjv1YzI5+JfsspY81g/McZ/U71zmsJTE5zrH6pRXsovrJQYeAQ1y25AUwm8FsdtwQlv65ATAMg5zCHOf0mJl5rqkyS8+P7zaPfkEmp/NP+3YcSrEQa0iZ2XVKZtOpaKadJoFNsFazrlfKV5SVw4b/Ha32cedd3IEBV3eshYhq6NR+ePNOCM90tGP6wB1vMHnRTr415UMwBFrNPH/XALrFRPg3VmmwbAV21n26p9rHtenetBai8Q79l7YWtTrwPdutN1ZroIrJbqPNkTW1GFUD00BvhHHuM2Mq+X2c+yyObeX8Pg3phvdsPePXk/KzrdrXU89+UZhDQ2sxMu86YztTZppM51SaxfPon7367en809gM38+XH2AOcL+pD4wkKjjK9XOpfaV/DrLU3U/MGoPeV3Vl4/+OVGuAvwk7519Vh9YGsBVA0gTIK04MAsNh7Hy+2pXJoi2/Obs9dGV3JQZSq867qDUbPttbrQlozBYTvS5qU4tReUbJQS0KzDlB6zNrOdxmKFWZ+xaTidZpawksrGAwcl26EXb2042w+Ebr/zeS1v97k8OthlT9ejq6jlYv3OW7IEspLCp0fHKfV/4n+M658ov3ZeY5fs4vyvd5rGaTucz8+GXmzg92/VyyP8QaomuwHgqLDKJnQmt++fFola+l84a0rltTAv9vGvy20dUe8QqnQjrw5OKVzk39O0Rxx7AufghOGpOS62nH6sNVPqZnXbuezqLkoBaZw8Lo9nMSuaEtz7lqHgAmE1EZu+i2ewGhgwbR7rVX3W/qdSMsjZy1RQssLTcQlRFd5evJ2mqjx8vTF9mLyCrIcpXlVHH121xbrkevW1MRgRHn/NS+dMlOyU1/eEA4ZpPmp2hMLr65J5nHzpxztXEATCbadG3CsJvr0OKcO1fAj/Nc7QF/gL5jmfKfLaRnO5LrIKuZWWPjsJj1/02pfcNu6kbG0dwqLXrbplsUw26quzMVgZKDWhU6KJ6cNWuI2/YaKV0TOdJqcLklESa7jdZpa+m2ewEWu42wIUOwhHu+zoFIQ5J+Jp2/Dt7PIx+/Rpvcyq8nW/4CnrvaQsKZdKJDojEMg+zCbPe6+9I39QXl3+xnFWT5rS6/3E/wz77BL3XTr7p8qSproIXr7+/PqgUp/PrDEez2sv/GzWYTPS9qzbCbumENsPghynJkHITFf3a1W/aC4TP4YvsRPt3q+uT2kat7ENtC/x8V37AGWrj+3jjH9bSm/DWuzBYTPYfUseupAibDOOe0MA1W7969AUhOTq6117AdP07KpZeBzVELXBAQweHWQzgV1Y0iSxCWonyaZqTQ5sgaVymR1Uq37771+NNOkYbmH9v+wdwtcwkoNBj/tZ2LfgnnWEzZ66nl0TX8cF428680U2g10TSoKSaTicz8TIoM308vXLouv/T3koG25d30RwZFEmipu4+cpWHJPV3Ajh8Oc3jXKQryiggMttCme1N6XdSmbpU+FBXCu9fCofWOdkAo3PkdJ0I6cdXLKzmRUwDAwI5N+fhPCXpqIH5RF64nT+9xvZYc5OXlMX36dP7zn/9w4MABmjVrxvDhw3n22Wdp165dlc6RkZHB559/zvLly/npp5/Yv38/ZrOZXr16ccstt3D33XcTEBDgjXB9khwAHHnmL2QsWFDl/lE33UTrZ6fVYkQidZthGGQVZnE05yhHc49yLPcYR3OOkpSSxLHcY85+kTkGl2016LXfIKTA4EygiR0dTXwTZyIzzPs3BRaTxfnp/Nkz6VRYp6+6fBHv+e9f4Ie/u9oj34B+N3PPh5v5bNsRAIIDzKy4/2I6R4f5KUgR/6sTyUFeXh6XX345a9asoXXr1gwbNox9+/axfv16WrRowY8//khsbGyl53n66ad5/vnnMZvN9O/fn65du3L8+HF++OEH8vPzGTp0KF9++SWhXph5xFfJgT0vj4MT7yR3w4ZK+4bGx9P+7bcwB2kmD2mY7Iadk3knHTf9Occ4muueAJS0z9iqP2d0dUQERpS9wT9HnX5UUBRhAWGqyxfxl11fwYdjXe1+t8LI1/hs2xHu+XCzc/OU63tx+0Wd/RCgSN3h6T2uV4pTX3jhBdasWUNCQgJfffUV4cX18rNnz+ahhx5iwoQJfP/995WeJzw8nCeffJK7776btm1dS7SnpKRwxRVXsHr1av7617/ywgsveCNsnzAHB9P+rX9w9IXpZCxa5CwxcmO1EjV6NDFPPanEQOqtQnsh6bnpzhv8oznFN/2lE4Dco9jsvp1ys2fTnjw1+CnnzX6TwCZYzHW73lNESsn8DRb/ydVu0ROunUl6dj7PLN3u3DyoczPGJXTyfXwiDYzHTw4KCwtp2bIlGRkZbN68mf79+7vtj4uLY9u2bWzcuJELLrigxq/zn//8h1tuuYVOnTqxd+9eT0IGfPfkoDRbejoZSQvJXb8ee04O5rAwQgcNIipxjMYYSJ2WZ8tz3tyn5aS5bvpLJQDpZ9K9OnA3wBxATGgMLUNbEhMWw9Gco2w+trnyA89yX//7mNh3otfiEhEfKrLBeyPgwI+OtjUE7vwWo0VP7v5gMyu2pwEQEmDhiweG0bG5yolE/P7kYPXq1WRkZBAbG1smMQBITExk27ZtLFu2zKPkIC4uDoDDh6s+j2xdY42OJvrPf4I//6nyziI+UDKDT+n6/rTctDKf+mfmZ3r1dUOtocSExRATGuNMAFqFtXJLBkoGEpdIP5POlUlXVuvJg9VsZVS3UV6NXUR86LsXXIkBwLUzoeV5LNt62JkYADxxbU8lBiJe4nFysHXrVgAGDBhQ7v6S7SX9amrPHsfS1K1atfLoPCKNhd2wcyrvVLk1/SWf+tdGfX9UUJTjpj+s+EY/1JUElCQE4YHVn2IwOiSaG2NvZGHKwiofM7LrSKJD9FROpF7a/T9YNdvV7vt76H8bx7Ly+EupcqKELs257cKOfghQpGHyODk4cOAAQIUzEpVsL+lXU3//u2OGghtvvNGj84g0BDa7jfQz6W43+WcnAMdyj1FoL/Taa5ow0SKkhftNf6mfW4W2okVoC4KtwV57zbM9Puhx9p/ez8ajGyvtOzBmII8PerzWYhGRWnT6CCy6E0pKFZt3g+tmYwBPLd5ORq7jv22hgRb+ltgXs6YtFfEaj5OD7OxsgApnEAoLC3PrVxNvvPEGX3/9NVFRUTz+ePX+Z19Sd3W21NTUKs2gJOJr+UX5HMspLu8566a/5Of0vHTsht1rrxlgDnD/lP+sBCAmNIbokGi/L7AVbA3m9SteZ8aGGSzZvaTcEiOr2crIriN5fNDjBFk0wF+k3rEXwaKJkJvuaFuDYex8CApn6Zbf+O+Oo86uT157Hu2beT6DoYi4ePx/+pLxzBXN4+3pTKnff/89999/PyaTiXfeeYc2bdp4dD4Rf8ouyHb7tL+8qTwz8jO8+poh1hC3m/yzS3xahrakaXDTejNNZ7A1mCkJU7in3z0sTlnMhrQN5NhyCLOGEd8qnlHdRqmUSKQ++34G7Fvlag9/EVqdz9HTeUz51DXAcmjXaG69sIMfAhRp2DxODiIiIgDIyckpd39ubi6Ac3rT6ti2bRsjR46koKCAOXPmMGpU9QcWVjRSu6InCiI1YRgGp/JPuQ3kdZvVpzghyLXlevV1I4Mi3Qb1xoQ5yntKt8MDwhvkIlzRIdFM7DtRMxGJNCR7voPv/+Zqnz8GLhiPYRg8uehnMs84yonCg6y8OKZPg/xvm4i/eZwcdOjgyNoPHTpU7v6S7SX9qio1NZWrr76ajIwMpk6dyr333utZoCI1VFLff/b0naVn9TmWe4wCe4HXXtOEieiQaLeb/LM//W8Z2rJW6/tFRHwq6ygsnIhznEGzLjDiFTCZWLjpEP/71bVC+tPXnUe7pionEqkNHicHJVOMbt5c/vzjJdv79u1b5XMePnyYK6+8krS0NO6//36mTJniaZgi5covyi9b039WApB+xrv1/Vaz1XXTX06Nf6uwVjQPaU6AOcBrrykiUqeVjDPIKU4ALIGOcQbBTUjLzGPaMlcVwMXdW/D7+Pb+iVOkEfA4ObjooouIjIwkNTWVLVu2lFnrICkpCYARI0ZU6XynTp3i6quvZu/evdx+++28/PLLnoYojVROYQ5Hc46SlptW7kw+R3OOcir/lFdf01nff1ZNf+kEoFlws3pT3y8i4hOrXoK937vaV78AreMwDIPHF20jK88x+UBEkJUXR6ucSKQ2eZwcBAYGMmnSJJ5//nkmTZrEV1995ZyhaPbs2Wzbto2hQ4cSHx/vPGbevHnMmzePUaNGMX36dOf23Nxcrr32WrZv385NN93EW2+9pf8ASBmGYZCRn+FatCun7Kw+R3OPklNY/jiYmmoS2OScg3pjwmKICIjQv1kRkerYtxq+c90L0OtGiL8DgAUbD/HdzuPOXc9c34s2USG+jlCkUfHKvIRPP/00X3/9NWvWrKFbt24MGzaM/fv3s27dOpo3b867777r1j89PZ2dO3dy5MgRt+1PPfUUa9euxWKxYLVa+eMf/1ju682fP98bYUsdVGQvcq/vP2vBrpJyH2/X9zcPaV5mYO/ZJT8hVv0PSUTEq7KPQ9IfoaR0s2knuGEumEz8lnGG55bvcHa9tEcLxl5Q/ppKIuI9XkkOgoOD+fbbb5k+fToffvghS5YsoWnTpowbN47nnnuO9u2rVht46pSjxKOoqIgPP/ywwn5KDuqngqKCMjX9Z9/8p59Jp8go8tprWk1W581+6Rr/lmEtnbP6RIdGq75fRMTX7HZYfCdkpzna5gBIfBeCIx3lRAu3kZVfXE4UbGX66L56MiviAybD04UI6qmSqUwrmupUqie3MNdt9p4yK/fmHuVk3kmvvmawJZhWYa3KXa235JN/1feLiNRRq16C/z3rag+fAYP/DMB/1h/giUU/O3e9NDaOMXpqIFIlnt7j+ne500Ym/Uw6i1IWsTFtY71ZtMkwDDLzM8uU+JydAGQX1nwF7PI0CWziNm9/eQlAk8Am+hRJRKQ+2v8jfPO8q91zBFz4JwAOncrlr6XKia44ryWjB7T1dYQijZaSAx/Is+Xx4voXWZq6FJvd5rbvxyM/8trW1xjZdSSPD3qcIEuQz+IqshdxIu+EcyCvc1afsz71zy/K9+rrNg9u7jaQt1VYK7dZfVqGtiQ0QPNXi4g0SDknIGkClJSQRnWAG+eByYTdbvBo0jZyChz7IkMCeGGUZicS8SUlB7Usz5bHXV/fxcajGyvsY7PbSNqVxL7Mfbx+xeteWdiqsKiQY2fc5+8vmdWnpH0897jX6/tbhLaocFBvTGgMLUJaEGBRfb+ISKNkt8OSP0PWYUfbbHWMMwhpCsAH6w+wJvWEs/u0G3rTsokWexTxJSUHtezF9S+eMzEobePRjczYMIMpCede9C23MLfMfP1uM/rUUn1/mUG9pcp+YsJU3y8iIpX4cS6kfOVqXzEN2g0E4ODJXKZ//otz11W9YrixXxtfRyjS6Ck5qEXpZ9JZmrq0WscsSVnC8E7DKSgqqLDGP6swy6txRgRGlLtSb+lP/FXfLyIiHjm4Hr6e5mp3vwYS7gHAbjd4JGkrucXlRE1DA3he5UQifqHkoBYtSllUZoxBZWyGjTu+usNrMTQLbuZ2k1/eyr2q7xcRkVqVe9J9nEGTdjDyNSi++f/32v2s3eN64v3sjefTIsJ3Y/BExEXJQS3amFa1cqKasJgszvr+cgf2hjnq+wMtgbUWg4iISKUMA5beA5kHHW2TBRLfgdBmAOxLz+HFFb86u1/bpxUj+rb2R6QigpKDWpVjy6nRcSZMtI9oX7bE56z5+y1mi5cjFhER8bK1r8HOz13ty/8CHS4EcM5OdKbQ8UShWVggz954vsqJRPxIyUEtCrOG1ei4wa0H84+r/uHlaERERHzs0Cb4b6lJNrpeCUPuczbnr9nH+n2ucqLnbjyf6HCVE4n4k6aWqUUDWw2s0XHxreK9HImIiIiPncmApPFgL3S0I9rAqDfB7Lj12HM8m7996SonGtG3NdepnEjE75Qc1KLR3UZjNVfv4YzVbGVUt1G1FJGIiIgPlIwzyDjgaJsskPhPCGsOQJHd4JGkbeQV2gGIDneUE4mI/yk5qEXRIdHcGHtjtY4Z2XUk0SHRtRSRiIiID6z/B/y63NW+9EnoOMTZfGf1XjbtP+Vs/3VkH5qFaQINkbpAyUEte3zQ4wyMqVp50cCYgTw+6PFajkhERKQWHd4CXz3tasdeBkMnO5u7j2Uz66udzvaN/dow/PxWvoxQRM5ByUEtC7YG8/oVr5PYPbHCEiOr2Upi90TeuPINgiwaiCUiIvVUXiYsGA9FBY52eCsY9Q/nOIMiu8HDC7aSb3OUE7WICGLq9b39FKyIlEezFflAsDWYKQlTuKffPSxOWcyGtA3k2HIIs4YR3yqeUd1GqZRIRETqN8OAT++DU/scbZMZxrwN4S2cXd5atYefDmY42y+M6kNTlROJ1ClKDnwoOiSaiX0nMrHvRH+HIiIi4l0b/wk7lrjalzwOnYc5mylHs5j91S5ne/SAtlzZK8aHAYpIVaisSERERDxzZBt88aSr3fliuPhhZ9NWZOfhBVspKHKUE8U0CWLKCJUTidRFSg5ERESk5vKziscZ5DvaYS1h9Ntgtji7vLlyD1sPZTrb00f3ITI0wMeBikhVKDkQERGRmjEMWPYAnEwt3mCCMW9BhKtc6Ne007zytaucaOwF7bisp8qJROoqJQciIiJSM5vfg+1JrvbFj0CX3zmbhcXlRIVFBgCtI4N5ekQvHwcpItWh5EBERESqL207rHjM1e44FH7nvlbP69+lsv230872i2P6EhmiciKRukzJgYiIiFRPfrZjnIEtz9EOjXZMW1pqnMGOw6eZ+02Ks/3/4ttzSfcWiEjdpuRAREREqs4w4LOH4ITrxp/Rb0KT1s5mgc29nKhNZDBPXXeeryMVkRpQciAiIiJV99MHsO0jV3voZOh6hVuXV7/dzY4jrnKivyXGERGsciKR+kDJgYiIiFTNsV/gM9f6BXRIgEufcuuy/bdMXv12t7N9y4UdGNot2lcRioiHlByIiIhI5QpyiscZnHG0Q5rBmH+CxerqUlxOZLM7yonaRoXw5LUqJxKpT5QciIiISOU+fxSO/+pqj3oTItu6dZn7TQq/pmU52zMT+xIeZEVE6g8lByIiInJuWz+Cn953tS+6H7pf5dZl26EMXvsu1dn+Q0JHhnRVOZFIfaPkQERERCp2fBcsn+xqt78QLnvGrUu+rYiHPtlKUXE5UYdmoTw2vKcvoxQRL1FyICIiIuUrPOMYZ1CY42gHRxWPM3CfeeiVr1NIOZbtbP8tsS9hKicSqZeUHIiIiEj5VjwGx5Jd7VFvQFR7ty4/Hczgze9d5UTjh3RicJfmvopQRLxMyYGIiIiU9XMSbH7P1U6YBD2uceuSV1jEQ5/8RHE1EZ2ah/Lo8B4+DFJEvE3P/ERERBqz7GOOJGDfD1CQDYHh0LIXbHrX1aftBXD5lDKHvvzfXaQed5QcmUwwc2wcoYG6tRCpz3QFi4iINEaFZxxlQz99CPZC9317vnX9HNQEEt8Fa6Bbl037T/GPVXuc7QkXdSa+U7PajFhEfEDJgYiISGNTeAbeT4T9qyvv26QthLd025RXWMQjC7ZiFJcTdYkO4+GrVE4k0hBozIGIiEhjs+KxqiUGAMd/gS8ed9s068ud7El3lBOZi8uJQgIt3o5SRPxAyYGIiEhjknXUUUpUHVs+cIxNADbsO8k/f9jr3DVxWBcu6NjUmxGKiB+prEhERKQhMgxH+VD+acjLhLzi7z+9X3aMQWXshbD5X+QOfsCtnCi2RRgPXtnd+7GLiN8oORAREamL7EXFN/bFN/XOm/zMs7ZllNOn+Ht1k4Bz2beav2Vcw74TuYCjnOilm/oRHKByIpGGRMmBiIhIbSjMc93MV3YTX962gix//wZusk5nMH/HPmf7T5fE0q99lN/iEZHaoeRARETkbHa742b9nDfxFdzUl7SLCvz9W7hYAiE40jEtac4xyK9+4vHrSbvz5+4x4TxwRTdvRigidYSSAxERaXgK8866ac+o+Ca+vBv//CzA8Pdv4RIY4bi5D27iuskPjqxgWxMIjnJvW4Mdq5QBrJwJ3/y12iF8m++YqtRiNjFrbBxBVpUTiTRESg5ERKRusdsdJTXnvIkvr/a+VLso39+/hYs5oOo38SU3/KW3BTUBsxdvxPv/Ab6bUa3xCAWGhU+KLgXgrkti6dsuynvxiEidouRARES8y5Zf6qa9kpv4igbZ1qlP7cOr+Gl9JASVsz8gxPWpfV0QEQP9boHN71Xa1QBMQFLRJaQTSc9WEdx7eddaD1FE/EfJgYiIuNjtUJB9jpv4jMpv9G15/v4tXMzWqt3El9un+FN7SwP8X+U1M+BEaqULoZmAtfbzmGb7A1aVE4k0Cg3wv3gi0ihkH3N88rnvB8fNbGA4dBoKA/4A4S39HZ3/2AqqPmC2vDKd/Cww7JW/jq8EhFXh0/rSn+if1a5rn9rXFQEhcFuSY+XjLR+UW2JkN1v5qOBiptn+QD6B3H9pV85vG+mHYEXEl0yGYXjl2W1eXh7Tp0/nP//5DwcOHKBZs2YMHz6cZ599lnbt2lXrXBkZGUydOpXFixeTlpZGq1atGDlyJNOmTSMqKsob4dK7d28AkpOTvXI+EfGRwjOw4jHHCq/l1UybA6D/rTB8BgQE+z4+TxiGI9Ep9yY+o2o3+rYz/v4tXEyWc9/EV3aj31A/ta9rso/B5n/BvtXORDu/3RBGr40l+bTjGjqvdROW3nMRgVazn4MVkcp4eo/rleQgLy+Pyy+/nDVr1tC6dWuGDRvGvn37WL9+PS1atODHH38kNja2Suc6ceIECQkJpKSk0KVLFwYOHEhycjLJycl07dqVtWvX0rx5c09D9ktykJ52kJQvXiX8yDoCi3IpsISS0zqBrsPvIrpVe5/FIVJvFZ6B9xMrLYUAoONQxyejASG1H1eJosKqz4xTbplOFhhFvou3MgGhVbiJP3tQbak+AaH61L4eOJ6Vz8cbDrBu70my822EB1nJyC3k598yAbCaTXw6aSi92jTxc6QiUhWe3uN65SOZF154gTVr1pCQkMBXX31FeHg4ALNnz+ahhx5iwoQJfP/991U614MPPkhKSgqjR4/m448/xmp1hHjfffcxd+5cJk+ezHvvVT6Iqi7Jy81m29t/pv+Jz0kwlfofvw3Yt5nC199gXfPriJv4BsEhYX6LU6TOW/EY7F/tHCRZEQMw7V/tKJm4/u9VO7dhQEFOBTfxGederKqkXZjr+e/oLSZz5SU35xxU2wQsAf7+LaQW5RUWMW1ZMkmbDlFYVPHnhHf/LlaJgUgj4vGTg8LCQlq2bElGRgabN2+mf//+bvvj4uLYtm0bGzdu5IILLjjnudLS0mjbti0Wi4WDBw8SExPj3Jefn0/79u05efIkv/32m9u+mvDVk4O83GxSXxlO74KfK+2bHNiH2Ae+IDg0vFZjEqmXso5ivNwbUzWmXzRMFkxXFc/nfs7Fq4pv9Ovap/bn/LS+pB1V/qDawDB9ai8VyissYtw761m392SlfQd1bsa/JgwiOEADkUXqA78/OVi9ejUZGRnExsaWSQwAEhMT2bZtG8uWLas0OVixYgV2u51LL720zM1/UFAQ119/Pe+88w4rVqxg/PjxnobuE9ve/jODCn7GMM79/2nDgN4FP7Pu7bu48L5/+y5A8YxhFH/ZHTeWhh3sxd9Lf7ltK/Wzvbxt5zq+vGPLe22jgniKXPGe85xVjaf0a1cxnpr+jjnHq5UYAJiMIvjyiVp688/1wubim/SzZ8ap4qDaoCZgDfR93NJoTFuWXKXEAGD93pNMW7aD6aP71HJUIlIXeJwcbN26FYABAwaUu79ke0k/T8/1zjvvVOlcdUF62gH6n/gcTJV/gFeyf8CJz0g/coDomLbnuKk0KriRqspNnFHBjV2pm8Zz3eTW6KaykhtVr98418bvWMHfvC7N6iLeYw2p+sw45fUJDNen9lJnHcvKI2nToWodk7TpIJOv7E6LiKBaikpE6gqPk4MDBw4AVDgjUcn2kn6+OlddkPLFa+5jDKogwFRE9Jv6dEbEW7KNEDabzyfLFEY2oY4vUxhZhJJT/D2bMLJNxd8JpdAUAAU4vqokp/jrcK39HiLekp1vO+cYg/IUFhl8svEg91yqBdBEGjqPk4Ps7GwAQkNDy90fFhbm1s9X5ypRUnd1ttTU1CrPoFRT4UfW1er5pX6zGWbsmDAwU4TjZ8eX4+cizBhuP5soMsyl+pjd+pc+puR8FR1Tcj47ZorKi8Ewu+0re0zZ17Zjxm6YS/UzndXv7GPMztdyi7eCvg9ZP6GPeV+1/86b7V35Q/6D1TjCDuRX+3VEGrq1e04oORBpBDxODkrGM5sqeIRenfHO3jxXXRBY5PuZS2znuHl03YBVfvN4rmMcN4Emt2PK3txVdEzZm1H3G8Kzb3RNbjecZW+iy96Mun6nCm5Gyzmm5Ma2shv0sudz/S1cN+aOfUaZY1znOfdcO1Ke3kX7apQcrLWf5/1gRBqh7Hybv0MQER/wODmIiIgAICcnp9z9ubmOG+SS6U19da4SFY3UruiJgjcVWEId05VWU7K1N0Uj38QwWcBkxjCZy37HXLzf5Oznixpnc/GXiK/N+bSIghMLCaxGqV6BYWF7zA0k3ZBQi5GJ1C/PLt/BtkOZ1T4uPEgL0ok0Bh5f6R06dADg0KHyBzeVbC/p56tz1QXZrS+EfZurfVxWu98x+HyNOxApbdD555H0zcXcYv22SrN/mUyQVHQJF/Y5j4GdmvkuUJE67qpeMTVKDgZ38XwBUhGp+zz+EDguLg6AzZvLvwku2d63b1+fnqsu6Db8bgqN6s0LXWhY6Dr8rlqKSKT+uim+PS8Y41lrP69Ks3+ttZ/H88Y4bhqo1cdFSrspvj0Bluo9aQ6wmHQtiTQSHicHF110EZGRkaSmprJly5Yy+5OSkgAYMWJEpecaPnw4ZrOZVatWcezYMbd9+fn5LFu2DLPZzDXXXONp2D4R3aoDW5pfCzg+yTyXkv2bm19HdCv9B1jkbC0jgrn+gi6MK3iMD22XUVBB4l1gWPjQdhnjCh7jhgtiNfWiyFlaRgSTeEH5swJWJPGC9rqWRBoJj5ODwMBAJk2aBMCkSZPcxgvMnj2bbdu2MXToUOLj453b582bR8+ePXniCffFiVq3bs3NN99MQUEBd999Nzabq2D/0Ucf5fjx49xyyy20atXK07B9pu8db5Ac2KdKn3QmB/YhbuIbvglMpB6acn1v+nVuxZO2OxiSP4+/Fd7EyqI+bLZ3ZWVRH/5WeBND8ufxpO0O+nVuxZTre/k7ZJE6acr1vbmwc9XK7S7s3EzXkkgjYjK8MAVQXl4ev/vd71i3bh2tW7dm2LBh7N+/n3Xr1tG8eXPWrl1L166u6c+mTp3KtGnTGDduHPPnz3c7V3p6OoMHD3ZONTpw4ECSk5PZvn07sbGxrF27lujoaE9D9nhp6erIy81m69t3MeDEZwSUM5iy0LCwufl1xE18g+CQsFqPR6Q+yyssYtqyHSRtOljuXO0BFhOJF7RnyvW9CA6oXlmfSGOia0mkYfL0HtcryQHAmTNnmD59Oh9++CEHDx6kadOmDB8+nOeee4727d3LZM6VHACcOnWKKVOmsGTJEo4ePUpMTAw33ngj06ZNo1kz7wws9GVyUCI97SC7v3idsCM/EliUS4EllJzWCXQdfpdKiUSq6XhWPp9sPMjaPSfIzrcRHmRlcJfm3DRQ5Q8i1aFrSaRhqTPJQX3jj+RARERERKQ2eXqPqynrRUREREQEUHIgIiIiIiLFlByIiIiIiAig5EBERERERIopORAREREREaARz1YUERFBYWEhsbGx/g5FRERERMQrUlNTCQgIICsrq0bHN9onB2FhYQQEBPjltVNTU0lNTfXLa0vV6X2qH/Q+1X16j+oHvU/1g96n+sGf71NAQABhYTVfVLfRPjnwJ62xUD/ofaof9D7VfXqP6ge9T/WD3qf6oT6/T432yYGIiIiIiLhTciAiIiIiIoCSAxERERERKabkQEREREREACUHIiIiIiJSTLMViYiIiIgIoCcHIiIiIiJSTMmBiIiIiIgASg5ERERERKSYkgMREREREQGUHIiIiIiISDElByIiIiIiAig5EBERERGRYkoOvCAvL48pU6bQvXt3goODadOmDRMmTODQoUPVPldGRgYPPPAAHTt2JCgoiI4dO3L//feTkZHh/cAbGW+9T506dcJkMlX49euvv9bSb9Dwbdq0iRdffJHRo0fTtm1bTCYTwcHBNT6frifv8+Z7pGupduTm5rJkyRL++Mc/0rdvX5o0aUJYWBhxcXE8++yzZGdnV/ucupa8z9vvk66n2jN79mxGjx5Nt27diIyMdF4D48aNIzk5udrnq+vXkxZB81BeXh6XX345a9asoXXr1gwbNox9+/axfv16WrRowY8//khsbGyVznXixAkSEhJISUmhS5cuDBw4kOTkZJKTk+natStr166lefPmtfwbNUzefJ86derE/v37GTduXLn7p0+fTuvWrb0ZfqMxcuRIli5d6rYtKCiIvLy8ap9L11Pt8OZ7pGupdrz99ttMnDgRgN69e9OrVy9Onz7NmjVryMrKomfPnnz//fe0bNmySufTtVQ7vP0+6XqqPdHR0eTk5NC3b1/atm0LQHJyMrt27SIwMJAlS5ZwzTXXVOlc9eJ6MsQjzzzzjAEYCQkJRlZWlnP7Sy+9ZADGxRdfXOVz/d///Z8BGKNHjzYKCwud2++9914DMP7whz94NfbGxJvvU8eOHQ1dOrXjxRdfNP7yl78Yy5YtM9LS0gzACAoKqtG5dD3VDm++R7qWasd7771n3HXXXcauXbvcth8+fNjo37+/ARg333xzlc+na6l2ePt90vVUe1avXm2cOXOmzPbXXnvNAIw2bdoYNputSueqD9eT/hV5oKCgwIiKijIAY/PmzWX29+3b1wCMjRs3VnquI0eOGGaz2QgICDDS0tLc9uXl5RktWrQwLBZLmX1SOW++T4ah/wD7Uk1vPHU9+Y6Sg/plzZo1zvcsPz+/0v66lvyjuu+TYeh68peuXbsagJGcnFxp3/pyPWnMgQdWr15NRkYGsbGx9O/fv8z+xMREAJYtW1bpuVasWIHdbufiiy8mJibGbV9QUBDXX389RUVFrFixwjvBNyLefJ+kftD1JFK+uLg4APLz8zlx4kSl/XUt+Ud13yfxH4vFAkBgYGClfevL9WT166vXc1u3bgVgwIAB5e4v2V7Sz9NzvfPOO1U6l7jz5vtU2syZM0lNTSUoKIjevXszatQoWrRo4Vmw4hW6nuoXXUu+s2fPHgACAgJo1qxZpf11LflHdd+n0nQ9+c6//vUvdu7cSffu3enSpUul/evL9aTkwAMHDhwAoF27duXuL9le0s9X5xJ3tfW3ffTRR93aDz74IHPmzOGPf/xjDaIUb9L1VL/oWvKdv//97wAMHz6coKCgSvvrWvKP6r5Ppel6qj0zZ84kOTmZnJwcfvnlF5KTk2nTpg0ffvghZnPlxTj15XpSWZEHSqYZCw0NLXd/WFiYWz9fnUvceftve8MNN7Bo0SL2799Pbm4u27dvZ/LkyeTn53PHHXewZMkSr8QtNafrqX7QteRbn3/+Of/85z8JCAjgueeeq9IxupZ8rybvE+h68oUvv/yS9957j6SkJJKTk2nfvj0ffvghF1xwQZWOry/Xk5IDDxjFs8CaTKZz7vf1ucSdt/+2c+bMYdSoUXTo0IGQkBB69+7NSy+9xGuvvQbAY4895lnA4jFdT/WDriXf+eWXX7jtttswDIOZM2c6a9oro2vJt2r6PoGuJ1/4+uuvMQyDU6dOsXLlSnr06MHvfvc7nn/++SodX1+uJyUHHoiIiAAgJyen3P25ubkAhIeH+/Rc4s5Xf9s77riDli1bsmvXLvbu3evRucQzup7qN11L3nXo0CGGDx/OqVOnmDx5Mvfff3+Vj9W15DuevE/nouvJ+6Kiohg2bBiff/45F1xwAc888wwbNmyo9Lj6cj0pOfBAhw4dACpcYbdke0k/X51L3Pnqb2s2m50LqR05csSjc4lndD3Vb7qWvCc9PZ0rr7ySAwcOcPvttzNr1qxqHa9ryTc8fZ/ORddT7QkICOD3v/89hmFUacbD+nI9KTnwQMnjvs2bN5e7v2R73759fXoucefLv+2pU6cA/2f9jZ2up/pP15LnsrKyuOaaa/j1118ZPXo0b731VoXlDBXRtVT7vPE+VUbXU+2Jjo4G4Pjx45X2rTfXk++XVmg48vPzjcjIyEoX11q/fn2l5zp8+LBhNpuNwMBA4+jRo277ShbGMJvNxpEjR7wWf2PhzffpXLZv326YTCYjNDS0yovWyLlRwwW2dD35Tk3fo3PRteS5vLw849JLLzUA4+qrr67x31HXUu3y1vt0Lrqeate4ceMMwJg5c2alfevL9aTkwENPPfWUARhDhgwxsrOzndtfeuklAzCGDh3q1n/u3LlGjx49jMcff7zMuW699VYDMMaMGeO2pPZ9991nAMZtt91We79IA+et9+mLL74odyXlrVu3Guedd54BGPfdd1/t/BKNUGU3nrqe/K+m75Gupdpjs9mMUaNGGYAxbNgwIycnp9JjdC35njffJ11PtWflypXGRx995PZv3zAMo6CgwJgzZ45hNpuNkJAQ48CBA8599f160joHHnr66af5+uuvWbNmDd26dWPYsGHs37+fdevW0bx5c9599123/unp6ezcubPcur9XXnmFtWvXsnDhQnr27MnAgQNJTk5m+/btxMbG8vLLL/vq12pwvPU+/fjjj0ybNo2OHTsSGxtLixYt2Lt3L5s3b8Zms3HJJZcwffp0X/5qDcpnn31WZuq+goICBg8e7Gw/88wzXHfddYCuJ3/w1nuka6n2zJs3j8WLFwOOkoe777673H6zZs1ylkToWvI9b75Pup5qT2pqKrfffjvR0dFccMEFNG/enPT0dH7++WeOHDlCcHAw8+fPp3379s5j6vv1pOTAQ8HBwXz77bdMnz6dDz/8kCVLltC0aVPGjRvHc8895/aPpTLR0dFs2LCBKVOmsGTJEhYvXkxMTAyTJk1i2rRp1V4lUVy89T5dffXVHDx4kA0bNrB161YyMzNp0qQJQ4cO5dZbb+X22293LqUu1Xf8+HHWrVvnts0wDLdtVanrBF1PtcVb75GupdpTUl8OOG8+yzN16lTnTee56FqqHd58n3Q91Z5LLrmEJ598ku+//55t27aRnp5OYGAgnTp1IjExkfvuu4+uXbtW+Xz14XoyGUYdmVRVRERERET8SrMViYiIiIgIoORARERERESKKTkQERERERFAyYGIiIiIiBRTciAiIiIiIoCSAxERERERKabkQEREREREACUHIiIiIiJSTMmBiIiIiIgASg5ERERERKSYkgMREREREQGUHIiIiIiISDElByIiIiIiAig5EBERERGRYkoOREREREQEUHIgIiIiIiLFlByIiIiIiAig5EBERERERIr9fyRMoy4ToEJoAAAAAElFTkSuQmCC\n",
      "text/plain": [
       "<Figure size 900x450 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.figure(figsize=(6, 3))\n",
    "logits = np.asarray([1, 5, 7, 10])\n",
    "Ts = [0.1, 1, 10, 100, 10000]\n",
    "for T in Ts:\n",
    "    plt.plot(softmax_with_t(logits, T), '-o')\n",
    "plt.legend(['T=0.1', 'T=1', 'T=10', 'T=100', 'T=1000'])"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "e978700d",
   "metadata": {},
   "source": [
    "## NCE => InfoNCE"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "1db7bcc5",
   "metadata": {},
   "source": [
    "- NCE: noise contrastive estimation\n",
    "- MoCo: https://arxiv.org/abs/1911.05722\n",
    "    - $\\tau=0.07$"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "12504399",
   "metadata": {},
   "source": [
    "$$\n",
    "\\text{Loss}=-\\log\\frac{\\exp(q\\cdot k_+/\\tau)}{\\sum_{i=0}^K\\exp(q\\cdot k_i/\\tau)}\n",
    "$$"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "7efed8c5",
   "metadata": {},
   "source": [
    "If we do not use the temperature parameter, suppose that the dot product of negative pairs are -1 ($q\\cdot k_-=-1$), and dot product of positive pair is 1 ($q\\cdot k_+=1$), and we have K = 1024, in this case, the model has separated the positive and negative pairs perfectly, but the softmax loss is still too large （不必要的惩罚）:\n",
    " \n",
    "$$\n",
    "-\\log \\frac{\\exp(1)}{\\exp(1)+1023\\exp(-1)}=4.94\n",
    "$$\n",
    "\n",
    "$$\n",
    "-\\log \\frac{\\exp(1/0.07)}{\\exp(1/0.07)+1023\\exp(-1/0.07)}=0\n",
    "$$"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "b1d21d78",
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.10.13"
  },
  "toc": {
   "base_numbering": 1,
   "nav_menu": {},
   "number_sections": true,
   "sideBar": true,
   "skip_h1_title": false,
   "title_cell": "Table of Contents",
   "title_sidebar": "Contents",
   "toc_cell": false,
   "toc_position": {},
   "toc_section_display": true,
   "toc_window_display": false
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
